sklearn之模型评估

cross_val_score,train_test_split

train_test_split

这个是最基本的交叉验证,会将原来的数据打乱
test_size表示将数据集分为训练和测试部分中测试部分的比例
random_state表示随机种子,一旦确定某个值后,再次调用该函数划分结果一样。
如下:

1
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=4)

当然如果要做K折交叉验证,还得用cross_val_score

cross_val_score

官网地址:cross_val_score
这篇blog讲的很好:交叉验证及其用于参数选择、模型选择、特征选择的例子
使用也非常简单,如下:

1
2
3
4
5
6
7
8
"""
先训练模型,然后将模型传入到交叉验证中
使用的是负均方误差函数(损失函数),因此得到的结果都是负的,需要在前面添加负号
这里只是想看模型的稳定性,当然交叉验证也可以用来调节参数,见上面的文章
"""
lr = LinearRegression()
lr.fit(X_train, y_train)
cross_val_score(lr, X_train, y_train, scoring = 'neg_mean_squared_error', cv = 10)

关于scoring:
Classification
‘accuracy’sklearn.metrics.accuracy_score
‘average_precision’sklearn.metrics.average_precision_score
‘f1’sklearn.metrics.f1_score
‘precision’sklearn.metrics.precision_score
‘recall’sklearn.metrics.recall_score
‘roc_auc’sklearn.metrics.roc_auc_score
Clustering
‘adjusted_rand_score’sklearn.metrics.adjusted_rand_score
Regression
‘mean_squared_error ’sklearn.metrics.mean_squared_error
‘r2’ sklearn.metrics.r2_score

提一下均方误差:反映估计量和被估计量之间差异程度的度量。设t是根据子样本确定的总体参数的一个估计量,那么的期望(即)就是t的均方误差;相对于数据集来说,y_train作为被估计量,y_pred作为估计量,数据集中的每一条记录当成一个结果(样本),用训练数据去训练模型,然后用测试数据算出测试数据在模型上的均方误差()
在kaggle上经常看到对交叉验证的结果要开根号,取得是方均根差 (),可以当成标准差():

1
2
3
4
5
scorer = make_scorer(mean_squared_error, greater_is_better = False)#定义一个得分机制,均方误差,越小越好,true表示越大越好
def rmse_cv_train(model):
rmse= np.sqrt(-cross_val_score(model, X_train, y_train, scoring = scorer, cv = 10))
return(rmse)

关于均方误差,RMS,RMSE的理解参考
http://blog.163.com/jey_df/blog/static/1825501612013411105655629/

KFlod

比如我使用5折,[1,2,3,4,5,6,7,8,9,10],每次调用该函数,都会给我如下分训练集和测试集:
[3,4,5,6,7,8,9,10] ,[1,2]
[1,2,5,6,7,8,9,10] ,[3,4]
[1,2,3,4,7,8,9,10] ,[5,6]
[1,2,3,4,5,6,9,10] ,[7,8]
[1,2,3,4,5,6,7,8] ,[9,10]
也就是说每次调用该函数,如果不改变随机种子,结果不变,所以这里可以用KFold中的shuffle属性来代替,其表示是否每次划分的时候洗牌
参考sklearn.model_selection.KFold

如果觉得有帮助,给我打赏吧!