了解机器学习过程和 K 折交叉验证
Understanding machine learning process and Kfold crossvalidation
我是机器学习的初学者,我一直在努力更详细地了解这个过程。
对于任何机器学习场景:
(1) 我做的第一步是将我的数据按 90% 到 10% 的比例拆分,并在最后一步保留 10% 用于测试
代码:
X1, X_Val, y1, y_Val = train_test_split(X, y, test_size=0.1,
random_state=101)
(2) 第二步,如果我的数据允许(不要太大),我运行一个K-Fold Cross
数据验证。
从那个分数,我可以得到我选择的模型的偏差、方差和准确性。
从这里,我可以像调整超参数一样调整模型,进行特征选择并尝试不同的算法(随机 forrest 等..)看看什么能给出最好的解决方案
代码:
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score
logreg = LogisticRegression()
scores = cross_val_score(logreg,X1,y1,cv = 10, scoring = "accuracy")
scores.mean()
scores.std()
(3) 现在我使用 cross_val_predict 得到 y 预测 (y_pred)
代码:
from sklearn.model_selection import cross_val_predict
ypred = cross_val_predict(logreg,X1,y1,cv = 10)
(4) 从那里,我可以 运行 分类报告:
代码:
print(classification_report(y1,ypred))
accuracy_score(y1,ypred)
confusion_matrix(y1,ypred)
(5) 现在如果我们对分类报告的结果感到满意,我们可以输入新数据或未见过的数据(X_val,y_val),在我们的例子中是测试集我们从第 1 步中删除
这样做是这样的:
代码:
logreg2 = LogisticRegression()
logreg2.fit(X1,y1)
y_pred2 = logreg2.predict(X_Val)
然后我们可以 运行 另一个 classification_report with (y_Val,y_pred2)
以上问题我有2个:
(1)步骤是否正确?如果我遗漏了什么,请随时告诉我。
(2) 我应该报告什么作为我的模型的实际准确性,第 5 步或第 4 步的分类报告?
非常感谢您的帮助
你的程序大体上是正确的。 中的讨论将很有用。未成年人 issues/clarifications:
在步骤#1中,我们通常使用术语"test set"而不是"validation set"(这里验证部分由K-fold CV覆盖),所以x_test
和 y_test
将是更合适的变量名称。
在第 5 步中,预计您将使用交叉验证期间选择的特定超参数(您的示例未明确显示这一点)。
由于您已使用测试集对模型进行最终评估,因此此处正确的做法是报告第 5 步的结果;尽管如此,只要您提供适当的说明,即 "CV accuracy x
, test accuracy y
".
,您也始终可以报告步骤 #4 的结果。
我是机器学习的初学者,我一直在努力更详细地了解这个过程。
对于任何机器学习场景:
(1) 我做的第一步是将我的数据按 90% 到 10% 的比例拆分,并在最后一步保留 10% 用于测试
代码:
X1, X_Val, y1, y_Val = train_test_split(X, y, test_size=0.1,
random_state=101)
(2) 第二步,如果我的数据允许(不要太大),我运行一个K-Fold Cross 数据验证。
从那个分数,我可以得到我选择的模型的偏差、方差和准确性。
从这里,我可以像调整超参数一样调整模型,进行特征选择并尝试不同的算法(随机 forrest 等..)看看什么能给出最好的解决方案
代码:
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score
logreg = LogisticRegression()
scores = cross_val_score(logreg,X1,y1,cv = 10, scoring = "accuracy")
scores.mean()
scores.std()
(3) 现在我使用 cross_val_predict 得到 y 预测 (y_pred)
代码:
from sklearn.model_selection import cross_val_predict
ypred = cross_val_predict(logreg,X1,y1,cv = 10)
(4) 从那里,我可以 运行 分类报告:
代码:
print(classification_report(y1,ypred))
accuracy_score(y1,ypred)
confusion_matrix(y1,ypred)
(5) 现在如果我们对分类报告的结果感到满意,我们可以输入新数据或未见过的数据(X_val,y_val),在我们的例子中是测试集我们从第 1 步中删除
这样做是这样的:
代码:
logreg2 = LogisticRegression()
logreg2.fit(X1,y1)
y_pred2 = logreg2.predict(X_Val)
然后我们可以 运行 另一个 classification_report with (y_Val,y_pred2)
以上问题我有2个:
(1)步骤是否正确?如果我遗漏了什么,请随时告诉我。
(2) 我应该报告什么作为我的模型的实际准确性,第 5 步或第 4 步的分类报告?
非常感谢您的帮助
你的程序大体上是正确的。
在步骤#1中,我们通常使用术语"test set"而不是"validation set"(这里验证部分由K-fold CV覆盖),所以
x_test
和y_test
将是更合适的变量名称。在第 5 步中,预计您将使用交叉验证期间选择的特定超参数(您的示例未明确显示这一点)。
由于您已使用测试集对模型进行最终评估,因此此处正确的做法是报告第 5 步的结果;尽管如此,只要您提供适当的说明,即 "CV accuracy x
, test accuracy y
".