Странное поведение многих классификаторов на данных UrbanSound8K - PullRequest
0 голосов
/ 07 октября 2019

Я скачал данные UrbanSound по ссылке [1]. В нем около 8732 звуковых файлов, разделенных на 10 сгибов. В инструкциях по ссылке предлагается тренировать модель на предопределенных 9 сгибах, тестировать на оставшемся сгибе и повторять процесс 10 раз, каждый раз тестируя на разных сгибах.

Я выделил 11 других функций (например, скорости пересечения нуля, энергии и т. д.) и 40 функций MFCC из каждого файла, как это сделали многие другие [2] [3]. Вот фрагмент кода:

'' '

# Approach 1 of splitting the data

# 'fold' names what fold (from 1-10) will be used for testing. All other folds will be used for training. For, e.g., train_fold1 represnt features extracted from nine folds: fold2 to fold10, and test_fold1 has features from fold1.

df_train = pd.read_csv('G:\\AudioFiles\\UrbanSound8K\\train_{}.csv'.format(fold, index = False))   
df_train.fillna(0, inplace = True)
df_train.dropna(inplace = True)
df_train = df_train.iloc[:,:-1]
df_train = pd.get_dummies(df_train) # one-hot-encoding class variables
X_train = df_train.iloc[:, 12:-10] # taking only 40 MFCC features
y_train = df_train.iloc[:, -10:]

df_test = pd.read_csv('G:\\AudioFiles\\UrbanSound8K\\test_{}.csv'.format(fold, index_col = 0))
df_test = df_test.iloc[:,:-1]
df_test.dropna(inplace = True)
df_test = pd.get_dummies(df_test) # one-hot-encoding class variables
X_test  = df_test.iloc[:, 12:-10] # taking only 40 MFCC features
y_test  = df_test.iloc[:, -10:]

# Approach 2 of splitting the data
df = pd.concat([df_train, df_test])
df.dropna(inplace = True)
df  = pd.get_dummies(df)
X,y = df.iloc[:, 12:-10].values, df.iloc[:, -10:].values

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.1, random_state=13)

' ''

Моя проблема в том, что я получаю очень разные результаты для обоих подходов. Подход 2 дает точность 90-95% на тренировочном наборе и> 90% на тестовом наборе. Когда я использую подход 1, максимальная точность обучения 70-90%, но точность теста составляет всего 50-60%.

Я установил почти все классификаторы (LR, SVC, KNN) и простую нейтральную сеть из двух- три плотных слоя на обоих подходах разделения данных на наборы тест-поезд. Все классификаторы показывают поразительно схожую разницу в точности при обоих подходах.

'' '

# I tried fitting each of these one by one.
clf = LogisticRegression(solver='lbfgs')
#clf = SVC()
#clf = KNeighborsClassifier()
#clf = LinearDiscriminantAnalysis() 
#clf = GaussianNB()

clf.fit(X_train,y_train)
print(clf.score(X_train, y_train))
print(clf.score(X_test, y_test))

# code for neural network
model = Sequential()

model.add(Dense(256, activation='relu', input_dim=40))
model.add(Dropout(0.2))

model.add(Dense(256, activation='relu'))
model.add(Dropout(0.2))

model.add(Dense(10, activation='softmax'))

# Compile the model
model.compile(loss='categorical_crossentropy', metrics=['accuracy'], optimizer='adam')

num_epochs = 50
num_batch_size = 32

model.fit(X_train, y_train, batch_size=num_batch_size, epochs=num_epochs, validation_data=(X_test, y_test), verbose=1)

' ''

Я не могу понять, почему я получаю такую ​​разницу. Я не вижу ошибок в подгонке модели, так как мой процесс подбора довольно прост и понятен. Я использовал только настройки по умолчанию по большей части. Если я делаю некоторые другие ошибки, то же самое для обоих подходов.

Итак, это должно быть как-то связано с разделением поезда-теста. Случайная перетасовка дает гораздо лучший результат, чем предопределенные деления сгиба. Я пробовал долю теста 10-20% с другим начальным значением, но результаты все еще те же.

Ссылки

[1] https://urbansounddataset.weebly.com/urbansound8k.html

[2]https://medium.com/gradientcrescent/urban-sound-classification-using-convolutional-neural-networks-with-keras-theory-and-486e92785df4

[3] https://medium.com/@mikesmales/sound-classification-using-deep-learning-8bc2aa1990b7

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...