Tôi đang cố gắng tìm hiểu một số mạng lưới thần kinh cho vui. Tôi quyết định thử phân loại một số thẻ huyền thoại Pokémon từ bộ dữ liệu trên kaggle. Tôi đã đọc tài liệu và làm theo Hướng dẫn thành thạo về học máy, đồng thời đọc phương tiện truyền thông để cố gắng hiểu quy trình.
Vấn đề/câu hỏi của tôi: Tôi cố gắng dự đoán nhưng mọi thứ đều dự đoán là "0". Tôi nghĩ điều này là sai. Độ chính xác lỗi của tôi có phải là 92% không? Tôi đọc một cái gì đó trực tuyến về độ chính xác của lỗi.
请帮忙!
Một số thông tin cơ bản: Tập dữ liệu có 800 hàng và 12 cột. Tôi đang dự đoán cột cuối cùng (đúng/sai). Tôi đang sử dụng thuộc tính dữ liệu với số và phân loại. Tôi đã mã hóa các danh mục số bằng nhãn. 92% số thẻ này là giả. 8% là đúng.
Tôi đã lấy mẫu và chạy mạng lưới thần kinh trên 200 thẻ và đạt độ chính xác 91%... Tôi cũng đặt lại mọi thứ và đạt độ chính xác 92% trên tất cả 800 thẻ. Tôi có đang trang bị quá mức không?
Cảm ơn trước sự giúp đỡ của bạn
dataFrame = dataFrame.fillna(value='NaN')
bộ mã hóa nhãn = LabelEncode()
numpy_dataframe = dataFrame.as_matrix()
numpy_dataframe[:, 0] = labelencode.fit_transform(numpy_dataframe[:, 0])
numpy_dataframe[:, 1] = labelencode.fit_transform(numpy_dataframe[:, 1])
numpy_dataframe
X = numpy_dataframe[:,0:10]
Y = numpy_dataframe[:,10]
mô hình = Tuần tự()
model.add(Dense(12, input_dim=10, activate='relu'))
model.add(Dense(8, activate='relu'))
model.add(Dense(1, activate='sigmoid'))
model.compile(loss='binary_crossentropy', Optimizer='adam', số liệu=['độ chính xác'])
model.fit(X, Y, epochs=150, batch_size=10)
điểm = model.evaluate(X, Y)
print("\n%s: %.2f%%" % (model.metrics_names[1], điểm[1]*100))
#điều này cho thấy rằng chúng tôi có độ chính xác 91,88% với toàn bộ khung dữ liệu
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)
DataFrameFalseMẫu
dataFrameSampledTrueFalse = dataFrame65True.append(DataFrameFalseSample, ign_index=True)
dataFrameSampledTrueSai
#label mã hóa các tập tin
bộ mã hóa nhãn = LabelEncode()
numpy_dataSample = dataFrameSampledTrueFalse.as_matrix()
numpy_dataSample[:, 0] = labelencode.fit_transform(numpy_dataSample[:, 0])
numpy_dataSample[:, 1] = labelencode.fit_transform(numpy_dataSample[:, 1])
numpy_dataMẫu
a = numpy_dataframe[:,0:10]
b = numpy_dataframe[:,10]
mô hình = Tuần tự()
model.add(Dense(12, input_dim=10, activate='relu'))
model.add(Dense(8, activate='relu'))
model.add(Dense(1, activate='sigmoid'))
model.compile(loss='binary_crossentropy', Optimizer='adam', số liệu=['độ chính xác'])
model.fit(a, b, epochs=1000, batch_size=10)
điểmSample = model.evaluate(a, b)
print("\n%s: %.2f%%" % (model.metrics_names[1], ScoreSample[1]*100))
dataFramePredictSample = dataFrame.sample(500)
bộ mã hóa nhãn = LabelEncode()
numpy_dataframeSamples = dataFramePredictSample.as_matrix()
numpy_dataframeSamples[:, 0] = labelencode.fit_transform(numpy_dataframeSamples[:, 0])
numpy_dataframeSamples[:, 1] = labelencode.fit_transform(numpy_dataframeSamples[:, 1])
Xnew = numpy_dataframeSamples[:,0:10]
Ynew = numpy_dataframeSamples[:,10]
#đưa ra dự đoán
Y = model.predict_classes(Xnew)
# hiển thị đầu vào và đầu ra dự đoán
cho tôi trong phạm vi(len(Xnew)):
print("X=%s, Dự đoán=%s" % (Xnew[i], Y[i]))
câu hỏi:
Vấn đề là, như bạn nói, tập dữ liệu của bạn bị ảnh hưởng nghiêm trọngmất cân bằng. Điều này có nghĩa là lớp 0 có nhiều ví dụ huấn luyện hơn lớp 1. Điều này khiến mạng thiên về dự đoán lớp 0 trong quá trình đào tạo.
đánh giá:
Điều đầu tiên bạn nên làm làKHÔNGSử dụng độ chính xác làm thước đo đánh giá của bạn!ma trận nhầm lẫn, nhờ đó bạn biết chính xác những gì mô hình của bạn dự đoán. Bạn cũng có thể xem xét tính trung bình vĩ mô (nếu bạn chưa quen với kỹ thuật này, hãy đọc cái này).
Giải quyết vấn đề:
Có hai cách để cải thiện hiệu suất của mô hình của bạn:
- Lấy mẫu lạidữ liệu của bạn, làm cho nóTHĂNG BẰNG. Bạn có một vài lựa chọn ở đây. Cách tiếp cận phổ biến nhất là thực hiệnlấy mẫu quá mức(Ví dụ NHẸ ), đưa nó đến với đại đa số người dân. Một lựa chọn khác là làm cho hầu hết các lớpLấy mẫu dưới mức(Ví dụ Phân cụm trung tâm ), khiến dân số của nó giảm xuống tầng lớp thiểu số.
- sử dụng trong quá trình đào tạohạng cân. Điều này buộc mạngchú ý nhiều hơn đếnCác mẫu từ tầng lớp thiểu số (đọc bài đăng này Tìm hiểu thêm).
Tôi là một lập trình viên xuất sắc, rất giỏi!