【无标题】交叉验证随便写写理思路

随便写写【梳理思路】

一、交叉验证:

比如kfold=10:进行了十次训练,得到十个模型,该选取哪一个为最终模型??比如groupkfold=10:十次不一样的训练集和测试集划分,得到十个不同的参数,也就是十个不同的模型,最后该如何选取???


1、先看个简单的例子,学习交叉验证:

参考:(6条消息) 【scikit-learn】交叉验证及其用于参数选择、模型选择、特征选择的例子_JasonDing1354的博客-CSDN博客

from sklearn.cross_validation import cross_val_score
knn = KNeighborsClassifier(n_neighbors=5)
scores = cross_val_score(knn, X, y, cv=10, scoring='accuracy')
print scores
[ 1.          0.93333333  1.          1.          0.86666667  0.93333333   0.93333333  1.          1.        1.]

对十次迭代计算平均的测试准确率

print scores.mean() 0.96666666666


随便写写:

cv=10 意味着数据被分成了10份,每一份都被当作过训练集、测试集,进行了10次模型训练---得到10个不同的模型--也得到10个不同的分数--求了10次的均值
不理解之处:
既然是10个不同的模型、10个不同的分数,为什么要求10次均值,求均值的意义是什么?

解决:【以下是从网上、书上学习到的一些关于交叉验证的知识】

:):):):)
(1)不同的训练集、测试集分割的方法导致其准确率不同,而交叉验证的基本思想是:将数据集进行一系列分割,生成一组不同的训练测试集,然后分别训练模型并计算测试准确率,最后对结果进行平均处理。这样来有效降低测试准确率的差异。
(2)交叉验证是一种用于估计机器学习模型性能的统计方法。它是一种评估统计分析结果如何推广到独立数据集的方法。简单来说,就是将数据集分成不同的部分,然后某些部分训练,某些部分测试,某些部分验证,这样可以最大程度避免过拟合以及测试模型在陌生数据集的性能。

(3)十折交叉验证:10-fold cross validation 英文名叫做10-foldcross-validation,用来测试算法准确性。是常用的测试方法。将数据集分成十分,轮流将其中9份作为训练数据,1份作为测试数据,进行试验。每次试验都会得出相应的正确率(或差错率)。10次的结果的正确率(或差错率)的平均值作为对算法精度的估计,一般还需要进行多次10折交叉验证(例如10次10折交叉验证),再求其均值,作为对算法准确性的估计。



通过一些交叉验证原理的学习慢慢有了一个思维:

交叉验证并不是为了去获取一个模型,而是为了去评估这个模型的一些特性【对整体数据的一个预测评估,估计模型的性能】,所以取了一个均值。

最后保存的能够被使用的模型,并不是交叉验证所选出来的这个模型,而是交叉验证的模型,去全部数据集上面进行一个训练,得到一个模型,进行保存!!

【也就是从交叉验证结果中找到评估分数最高的那组模型,确定最终模型的超参。然后再使用最终确定的超参和完整的数据集(此时数据集不再进行切分,全部纳入模型训练),训练出一个最终的模型。】

【取平均值作为某个模型的性能指标,根据性能指标来挑选出最优模型,重新进行训练,获得最终模型】



关于交叉验证的其他学习:

交叉验证一方面可以用于调整超参数,也即是通过反复的交叉训练,找到模型最优的超参数,比如使用网格搜索GridSearchCV()。另一方面用于评估模型在数据集上的表现,比如cross_val_score()。

不涉及调参时【用于模型评估时】:

交叉验证用scores = cross_val_score(model, X_train, y_train, cv = n_folds, scoring = 'r2')

涉及调参时【选择参数】:

model_xgb = xgb.XGBRegressor(objective ='reg:squarederror')
parameters = {'loss':['ls','lad','huber','quantile'],
              'learning_rate':[0.1,0.07],  #(0,1]之间的超参数
              'n_estimators':[100,150],
              'max_depth':[2,3,4],  #设置树的深度
              'min_samples_split': [2, 3, 4], 
              'min_samples_leaf':[1,2,3,4]}
model_gs = GridSearchCV(model_gbr, parameters,cv=5)
model_gs.fit(X,y)
print('GBR Best score is:',model_gs.best_score_) 
print('GBR Best parameter is:',model_gs.best_params_)


交叉验证的作用:

参考:(6条消息) 【scikit-learn】交叉验证及其用于参数选择、模型选择、特征选择的例子_JasonDing1354的博客-CSDN博客

(1)进行调参,最终得到一组最佳的模型参数。得到一组最佳的参数使得测试数据的准确率和泛化能力最佳。

代码见参考


(2)模型选择
交叉验证也可以帮助我们进行模型选择,以下是一组例子,分别使用iris数据,KNN和logistic回归模型进行模型的比较和选择。


# 10-fold cross-validation with the best KNN model
knn = KNeighborsClassifier(n_neighbors=20)
print cross_val_score(knn, X, y, cv=10, scoring='accuracy').mean()
0.98


# 10-fold cross-validation with logistic regression
from sklearn.linear_model import LogisticRegression
logreg = LogisticRegression()
print cross_val_score(logreg, X, y, cv=10, scoring='accuracy').mean()
0.953333333333

根据score选择logistic regression模型


(3)特征选择
通过交叉验证来进行特征的选择,对比不同的特征组合对于模型的预测效果。
import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
获得数据
data = pd.read_csv('http://www-bcf.usc.edu/~gareth/ISL/Advertising.csv', index_col=0)

# 创建特征名字的列表create a Python list of three feature names
feature_cols = ['TV', 'Radio', 'Newspaper']

# 提取出data中对应于特征名字的数据为dataframe形式use the list to select a subset of the DataFrame (X)
X = data[feature_cols]

# 选择对应的yselect the Sales column as the response (y)
y = data.Sales

# 进行10折交叉验证10-fold cv with all features
lm = LinearRegression()
scores = cross_val_score(lm, X, y, cv=10, scoring='mean_squared_error')
print scores
[-3.56038438 -3.29767522 -2.08943356 -2.82474283 -1.3027754  -1.74163618
 -8.17338214 -2.11409746 -3.04273109 -2.45281793]

这里要注意的是,上面的scores都是负数,为什么均方误差会出现负数的情况呢?因为这里的mean_squared_error是一种损失函数,优化的目标的使其最小化,而分类准确率是一种奖励函数,优化的目标是使其最大化。

# fix the sign of MSE scores
mse_scores = -scores
print mse_scores
[ 3.56038438  3.29767522  2.08943356  2.82474283  1.3027754   1.74163618
  8.17338214  2.11409746  3.04273109  2.45281793]

# convert from MSE to RMSE
rmse_scores = np.sqrt(mse_scores)
print rmse_scores
[ 1.88689808  1.81595022  1.44548731  1.68069713  1.14139187  1.31971064
  2.85891276  1.45399362  1.7443426   1.56614748]

# calculate the average RMSE
print rmse_scores.mean()
1.69135317081

选择其中两个特征名字进行验证:

# 10-fold cross-validation with two features (excluding Newspaper)
feature_cols = ['TV', 'Radio']
X = data[feature_cols]
print np.sqrt(-cross_val_score(lm, X, y, cv=10, scoring='mean_squared_error')).mean()
1.67967484191

根据结果对比某个特征对于模型性能的好坏!!!

——————————————————————:)

之后遇到别的再补充!!

随便写写over:):)

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值