# 使用sklearn实现交叉验证

## 1.交叉验证

scikit-learn非常友好已经帮我们实现好了分割方法(train_test_split)，我们现在测试一下采用鸢尾花数据集并简单的用树模型进行示例：

from sklearn.model_selection import train_test_split
from sklearn import datasets
from sklearn.tree import DecisionTreeClassifier
X,y=datasets.load_iris(return_X_y=True)
print(X.shape,y.shape) # (150,4) (150,)
# 测试集数据占40%，随机数种子为2021
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.4,random_state=2021)
print(X_train.shape,y_train.shape) # (90,4) (90)
print(X_test.shape,y_test.shape) # (60,4) (60)
clf=DecisionTreeClassifier().fit(X_train,y_train)
print(clf.score(X_train,y_train))
print(clf.score(X_test,y_test))
>1.0
>0.9666666666666667

from sklearn.model_selection import cross_val_score
clf=DecisionTreeClassifier()
scores=cross_val_score(clf,X,y,cv=5)
print(scores)
print(scores.mean())
[0.96666667 0.96666667 0.9        0.93333333 1.        ]
out:0.9533333333333334

scores=cross_val_score(clf,X,y,scoring='accuracy')
# scoring:各种评估标准，有兴趣可以参考sklearn.metrics里面含有各种评估指标

from sklearn.model_selection import ShuffleSplit
cv=ShuffleSplit(n_splits=5,test_size=0.2,random_state=2021)
cross_val_score(clf,X,y,cv=cv)

## 2.K-fold交叉验证

import numpy as np
from sklearn.model_selection import KFold
X=['9','8','7','6','5']
kf=KFold(n_splits=2)
for train_index,test_index in kf.split(X):
print(train_index,test_index)

[3 4] [0 1 2]
[0 1 2] [3 4]

## 3.留一法交叉验证(Leave One Out)

Loo是最简单的交叉验证，它的原理就是将我们数据集分成n份（对应n个样本），我们将n-1个样本进行训练，另外一个用于测试，这时我们就会产生n个数据集，该方法的优点就是不会浪费数据，训练集和原数据集能够最大程度还原。但是该方法可能会产生高方差，为什么呢？我们有n个数据集，用n-1份训练，剩余的1个用于测试，这是就会产生n种结果，而且用1个进行测试，很有可能出现该测试数据是异常数据，会导致结果方差很大，而且消耗计算资源较大。

from sklearn.model_selection import LeaveOneOut
X=['9','8','7','6','5']
loo=LeaveOneOut()
for train_index,test_index in loo.split(X):
print(train_index,test_index)

[1 2 3 4] [0]
[0 2 3 4] [1]
[0 1 3 4] [2]
[0 1 2 4] [3]
[0 1 2 3] [4]

## 4.留P法交叉验证

from sklearn.model_selection import LeavePOut
X=['9','8','7','6','5']
loo=LeavePOut(p=3)
for train_index,test_index in loo.split(X):
print(train_index,test_index)

[3 4] [0 1 2]
[2 4] [0 1 3]
[2 3] [0 1 4]
[1 4] [0 2 3]
[1 3] [0 2 4]
[1 2] [0 3 4]
[0 4] [1 2 3]
[0 3] [1 2 4]
[0 2] [1 3 4]
[0 1] [2 3 4]

## 5.随机排列交叉验证（ShuffleSplit）

from sklearn.model_selection import ShuffleSplit
X=['9','8','7','6','5']
ss=ShuffleSplit(n_splits=5,test_size=0.2,random_state=2021)
for train_index,test_index in ss.split(X):
print(train_index,test_index)

[0 3 1 4] [2]
[1 2 3 4] [0]
[3 2 4 0] [1]
[0 3 4 1] [2]
[3 4 0 1] [2]

## 6.时间序列分割（Time Series Split）

from sklearn.model_selection import TimeSeriesSplit
X=['9','8','7','6','5']
tss=TimeSeriesSplit(n_splits=3)
for train_index,test_index in tss.split(X):
print(train_index,test_index)

[0 1] [2]
[0 1 2] [3]
[0 1 2 3] [4]

## 7.数据集的归一化

from sklearn.preprocessing import StandardScaler
# 创建标准化实类
scaler=StandardScaler().fit(X_train)
# 数据标准化
X_train_trans=scaler.transform(X_train)
X_test_trans=scaler.transform(X_test)
clf=DecisionTreeClassifier()
clf.fit(X_train_trans,y_train)
clf.score(X_test_trans,y_test)
0.9666666666666667
tandardScaler().fit(X_train)
# 数据标准化
X_train_trans=scaler.transform(X_train)
X_test_trans=scaler.transform(X_test)
clf=DecisionTreeClassifier()
clf.fit(X_train_trans,y_train)
clf.score(X_test_trans,y_test)
0.9666666666666667

|
6天前
|

【机器学习】Ｋ折交叉验证StratifiedKFold的解析与使用

9 2
|
17天前
|

Sklearn入门指南：构建你的第一个机器学习模型
【7月更文第22天】在数据科学与机器学习领域，Scikit-learn（简称sklearn）是一个广泛使用的Python库，以其简洁的API和丰富的功能集而著称。本指南将引领你从安装到使用sklearn构建你的第一个机器学习模型，以一个简单的线性回归任务为例，逐步深入理解这个强大的工具。
45 2
|
2月前
|

31 3
|
2月前
|

27 0
|
2月前
|

46 6
|
3月前
|

python 机器学习 sklearn——一起识别数字吧
python 机器学习 sklearn——一起识别数字吧
29 0
|
3月前
|

python 机器学习 sklearn——手把手教你预测心脏病
python 机器学习 sklearn——手把手教你预测心脏病
135 0
|
3月前
|

59 0
|
3月前
|

【5月更文挑战第9天】Sklearn是Python热门机器学习库，提供丰富算法和预处理工具。本文深入讲解基础概念、核心理论、常见问题及解决策略。内容涵盖模型选择与训练、预处理、交叉验证、分类回归、模型评估、数据集划分、正则化、编码分类变量、特征选择与降维、集成学习、超参数调优、模型评估、保存加载及模型解释。学习Sklearn是迈入机器学习领域的关键。
71 3
|
3月前
|

41 0