我理解为什么模型的得分在每个random_state下都不同,但没想到最高分和最低分(random_state从0到100)之间的差异会达到0.37,这差异很大。我也尝试了十折交叉验证,差异仍然相当大。
那么这是否真的重要,还是我应该忽略它?
数据集链接(下载 -> 数据文件夹 -> student.zip -> student-mat.csv)
完整代码:
import pandas as pdacc_dic = {}grade_df_main = pd.read_csv(r'F:\Python\Jupyter Notebook\ML Projects\data\student-math-grade.csv', sep = ";")grade_df = grade_df_main[["G1", "G2", "G3", "studytime", "failures", "absences"]]X = grade_df.drop("G3", axis = "columns")Y = grade_df["G3"].copy()def cross_val_scores(scores): print("交叉验证结果 :-") #print("得分: {}".format(scores)) print("均值: {}".format(scores.mean())) print("标准差: {}".format(scores.std()))def start(rand_state): print("索引 {}".format(rand_state)) from sklearn.model_selection import train_test_split x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=.1, random_state=rand_state) from sklearn.linear_model import LinearRegression lin_reg_obj = LinearRegression() lin_reg_obj.fit(x_train, y_train) accuracy = lin_reg_obj.score(x_test, y_test) print("准确率: {}".format(accuracy)) acc_dic[rand_state] = accuracy from sklearn.model_selection import cross_val_score scores = cross_val_score(lin_reg_obj, x_test, y_test, scoring="neg_mean_squared_error", cv=10) cross_val_scores(scores) print()for i in range(0, 101): start(i)print("概览 : \n")result_val = list(acc_dic.values())min_index = result_val.index(min(result_val))max_index = result_val.index(max(result_val))print("最低准确率 : ")start(min_index)print("最高准确率 : ")start(max_index)
结果:
仅包含最高和最低结果最低准确率 : 索引 54准确率: 0.5635271419142645交叉验证结果 :-均值: -8.969894370977539标准差: 5.614516642510817最高准确率 : 索引 97准确率: 0.9426035720345269交叉验证结果 :-均值: -0.7063598117158191标准差: 0.3149445166291036
回答:
TL;DR
你用来训练和评估模型的数据集分割并不会决定最终模型在部署后的实际性能。分割和评估技术更多的是为了获得模型在现实生活中可能表现的有效估计。正如你所见,选择的分割和评估技术对这种估计有很大的影响。你的数据集结果强烈建议选择k折交叉验证而不是简单的训练/测试分割。
较长的版本
我相信你已经意识到,你对数据集进行的分割以分离训练集和测试集与最终模型的性能无关,最终模型可能会在整个数据集上训练,然后部署。
测试的目的是了解模型在未见数据上的预测性能。在最佳情况下,你最好有两个完全不同的数据集,来自不同的队列/来源来训练和测试你的模型(外部验证)。这是评估模型部署后性能的最佳方法。然而,由于你通常没有这样的第二个数据源,你会进行内部验证,从同一个队列/来源获取训练和测试的样本。
通常,如果这个数据集足够大,随机性将确保训练集和测试集的分割能很好地代表原始数据集,你获得的性能指标是模型在现实生活中预测性能的公平估计。
然而,正如你在自己的数据集上看到的,有时分割确实会极大地影响结果。正是为了这样的情况,你最好使用交叉验证技术,如k折交叉验证,并计算不同分割的平均值来评估你的性能。