簡體   English   中英

如何改進神經網絡預測、分類

[英]how to improve neural network prediction, classification

我正在嘗試學習一些神經網絡以獲得樂趣。 我決定嘗試從 kaggle 的數據集中對一些神奇寶貝傳奇卡進行分類。 我閱讀了文檔並遵循了機器學習精通指南,同時閱讀了媒體以嘗試理解這個過程。

我的問題/問題:我嘗試預測,一切都在預測“0”。 我認為這是錯誤的。 是我 92% 的錯誤准確率嗎? 我在網上閱讀了一些關於錯誤准確性的信息。

請幫忙!

一些背景信息:數據集有 800 行,12 列。 我正在預測最后一列(真/假)。 我正在使用具有數字和分類數據的屬性。 我標簽編碼的數字類別。 這些卡片中有 92% 是假的。 8%是真的。

我在 200 張卡片上采樣並運行了一個神經網絡,准確率達到了 91%……我還重置了所有內容,並在所有 800 張卡片上獲得了 92% 的准確率。 我過擬合了嗎?

提前感謝您的幫助

dataFrame = dataFrame.fillna(value='NaN')

labelencoder = LabelEncoder()

numpy_dataframe = dataFrame.as_matrix()
numpy_dataframe[:, 0] = labelencoder.fit_transform(numpy_dataframe[:, 0])
numpy_dataframe[:, 1] = labelencoder.fit_transform(numpy_dataframe[:, 1])

numpy_dataframe
X = numpy_dataframe[:,0:10]
Y = numpy_dataframe[:,10]
model = Sequential()
model.add(Dense(12, input_dim=10, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X, Y, epochs=150, batch_size=10)
scores = model.evaluate(X, Y)
print("\n%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))

#this shows that we have 91.88% accuracy with the whole dataframe


dataFrame200False = dataFrame 
dataFrame200False['Legendary'] = dataFrame200False['Legendary'].astype(str)
dataFrame200False= dataFrame200False[dataFrame200False['Legendary'].str.contains("False")]

dataFrame65True = dataFrame

dataFrame65True['Legendary'] = dataFrame65True['Legendary'].astype(str)
dataFrame65True= dataFrame65True[dataFrame65True['Legendary'].str.contains("True")]

DataFrameFalseSample = dataFrame200False.sample(200)
DataFrameFalseSample

dataFrameSampledTrueFalse = dataFrame65True.append(DataFrameFalseSample, ignore_index=True)
dataFrameSampledTrueFalse

#label encoding the files
labelencoder = LabelEncoder()

numpy_dataSample = dataFrameSampledTrueFalse.as_matrix()
numpy_dataSample[:, 0] = labelencoder.fit_transform(numpy_dataSample[:, 0])
numpy_dataSample[:, 1] = labelencoder.fit_transform(numpy_dataSample[:, 1])

numpy_dataSample
a = numpy_dataframe[:,0:10]
b = numpy_dataframe[:,10]

model = Sequential()
model.add(Dense(12, input_dim=10, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(a, b, epochs=1000, batch_size=10)

scoresSample = model.evaluate(a, b)
print("\n%s: %.2f%%" % (model.metrics_names[1], scoresSample[1]*100))

dataFramePredictSample = dataFrame.sample(500)
labelencoder = LabelEncoder()

numpy_dataframeSamples = dataFramePredictSample.as_matrix()
numpy_dataframeSamples[:, 0] = labelencoder.fit_transform(numpy_dataframeSamples[:, 0])
numpy_dataframeSamples[:, 1] = labelencoder.fit_transform(numpy_dataframeSamples[:, 1])

Xnew = numpy_dataframeSamples[:,0:10]
Ynew = numpy_dataframeSamples[:,10]


# make a prediction
Y = model.predict_classes(Xnew)
# show the inputs and predicted outputs
for i in range(len(Xnew)):
    print("X=%s, Predicted=%s" % (Xnew[i], Y[i]))

問題:

問題是,正如您所說,您的數據集嚴重不平衡 這意味着第 0 類的訓練示例比第 1 類多得多。這會導致網絡在訓練期間對預測第 0 類產生嚴重偏差。

評估:

您應該做的第一件事是不要將准確性用作評估指標! 我的建議是繪制一個混淆矩陣,以便您准確了解模型預測的內容。 您還可以研究宏觀平均(如果您不熟悉該技術,請閱讀此內容)。

處理問題:

有兩種方法可以提高模型的性能:

  • 重新采樣您的數據,使其變得平衡 你有幾個選擇。 最常見的方法是對少數類進行過采樣(例如SMOTE ),使其達到多數的總體。 另一種選擇是對多數類進行欠采樣(例如Clustering Centroids ),使其人口下降到少數群體。
  • 在訓練期間使用類權重 這迫使網絡更加關注少數類的樣本(閱讀這篇文章了解更多信息)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM