#machine-learning #scikit-learn #classification
#машинное обучение #scikit-learn #классификация
Вопрос:
Я новичок в машинном обучении и науке о данных. Извините, если это очень глупый вопрос.
Я вижу, что есть встроенная функция для перекрестной проверки, но не для фиксированного набора проверок. У меня есть набор данных с 50 000 выборками, помеченными годами с 1990 по 2010 год. Мне нужно обучить разные классификаторы на выборках 1990-2008 годов, затем проверить на выборках 2009 года и протестировать на выборках 2010 года.
РЕДАКТИРОВАТЬ: После ответа @Quan Tran я попробовал это. Вот как это должно быть?
# Fit a decision tree
estimator1 = DecisionTreeClassifier( max_depth = 9, max_leaf_nodes=9)
estimator1.fit(X_train, y_train)
print estimator1
# validate using validation set
acc = np.zeros((20,20)) # store accuracy
for i in range(20):
for j in range(20):
estimator1 = DecisionTreeClassifier(max_depth = i 1, max_leaf_nodes=j 2)
estimator1.fit(X_valid, y_valid)
y_pred = estimator1.predict(X_valid)
acc[i,j] = accuracy_score(y_valid, y_pred)
best_mod = np.where(acc == acc.max())
print best_mod
print acc[best_mod]
# Predict target values
estimator1 = DecisionTreeClassifier(max_depth = int(best_mod[0]) 1, max_leaf_nodes= int(best_mod[1]) 2)
estimator1.fit(X_valid, y_valid)
y_pred = estimator1.predict(X_test)
confusion = metrics.confusion_matrix(y_test, y_pred)
TP = confusion[1, 1]
TN = confusion[0, 0]
FP = confusion[0, 1]
FN = confusion[1, 0]
# Classification Accuracy
print "======= ACCURACY ========"
print((TP TN) / float(TP TN FP FN))
print accuracy_score(y_valid, y_pred)
# store the predicted probabilities for class
y_pred_prob = estimator1.predict_proba(X_test)[:, 1]
# plot a ROC curve for y_test and y_pred_prob
fpr, tpr, thresholds = metrics.roc_curve(y_test, y_pred_prob)
plt.plot(fpr, tpr)
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.0])
plt.title('ROC curve for DecisionTreeClassifier')
plt.xlabel('False Positive Rate (1 - Specificity)')
plt.ylabel('True Positive Rate (Sensitivity)')
plt.grid(True)
print("======= AUC ========")
print(metrics.roc_auc_score(y_test, y_pred_prob))
Я получаю этот ответ, который не отличается лучшей точностью.
DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=9,
max_features=None, max_leaf_nodes=9, min_samples_leaf=1,
min_samples_split=2, min_weight_fraction_leaf=0.0,
presort=False, random_state=None, splitter='best')
(array([5]), array([19]))
[ 0.8489011]
======= ACCURACY ========
0.574175824176
0.538461538462
======= AUC ========
0.547632099893
Комментарии:
1. Я не думаю, что я понял, что вы имели в виду, говоря «Мне нужно обучить разные классификаторы на выборках 1990-2008 годов, затем проверить на выборках 2009 года и протестировать на выборках 2010 года».
2. @MMF У меня есть данные о погоде с 50 000 выборками примерно для одного города. Вопросы (1) «Обучите случайный лес. Тренируйтесь в 1990-2008 годах. Используйте 2009 в качестве набора проверки. 2010 должен быть вашим тестовым набором.» (2) «Обучите одно дерево решений. Тренируйтесь в 1990-2008 годах. Используйте 2009 в качестве набора проверки. 2010 должен быть вашим тестовым набором.» Все с использованием Scikit-learn.
3. Вы имеете в виду «2009» как набор всех выборок, помеченных как «2009», верно?
4. Перекрестная проверка и train_test_split разделяют данные случайным образом. Разделение, которое вы хотите выполнить, не является случайным. Что вы хотите сделать, это отфильтровать ваши данные по трем наборам данных, используя python или любую библиотеку, такую как pandas, прежде , чем передавать их в классификаторы.
5. @MMF Да. Вы правы. извините. Я новичок в этом предмете. Столбцами данных являются год, месяц, день, максимальная температура, минимальная температура, максимальная влажность, минимальная влажность, дождь и т.д.
Ответ №1:
В этом случае существует три отдельных набора. Набор обучающих программ, набор тестов и набор для проверки.
Набор обучений используется для соответствия параметрам классификатора. Например:
clf = DecisionTreeClassifier(max_depth=2)
clf.fit(trainfeatures, labels)
Набор проверки используется для настройки гиперпараметров классификатора или нахождения точки отсечения для процедуры обучения. Например, в случае дерева решений max_depth является гиперпараметром. Вам нужно будет найти подходящий набор гиперпараметров, поэкспериментировав с различными значениями гиперпараметров (настройка) и сравнить показатели производительности (точность, ..) в наборе проверки.
Набор тестов используется для оценки частоты ошибок в невидимых данных. После получения показателей производительности в тестовом наборе модель не должна обучаться / настраиваться дальше.
Комментарии:
1. Отлично. Теперь я лучше понимаю. Означает ли это, что я должен использовать точность, AUC или MSE в наборе проверки, чтобы найти хороший набор гиперпараметров?
2. Да, так и должно быть.
3. Я отредактировал вопрос. Пожалуйста, дайте мне знать, если обнаружите какие-либо ошибки. Я, однако, обнаружил низкую точность даже после выбора наилучших параметров.