数据集的划分——Python实现

在建模时一般要将数据集划分为训练集、验证集、测试集

一、为什么要划分?

构建模型的目标是通过在训练集上训练模型,然后在验证集上验证模型的参数效果,最后在测试集上测试模型的泛化能力。
最终的目标是使模型的泛化能力最大化,也就是泛化误差最小化,然而怎样去度量或者近似度量泛化误差呢?

1.训练误差=经验误差(×)

原因:很可能出现过拟合,也有可能出现欠拟合

  • 过拟合:学习器把训练样本学的太好了,以至于把训练样本自身的一些性质作为潜在样本会具有的一般性质,这样会导致泛化性能下降。
  • 欠拟合:训练样本的一般性质尚未学好
2.泛化误差(×)

不可能泛化到所有的可能性

3.测试误差作为泛化误差的近似(✔)

二、怎样划分?

1.留出法(hold-out cross-validation)
  • 要尽可能保持数据分布的一致性,也就是训练集和测试集中样本类别比例是一致的。
  • 一般取2/3~4/5作为训练集。
  • 适用:数据量足够
  • 缺点:只做一次分割且比例是自己确定的、分割后数据分布与原始分布的差异等敏感问题
  • 改进:在验证模型效果的时候,可以随机分割训练集和测试集,一般随机生成10000次,然后生成模型准确率的分布。这样评估模型效果更加客观。通过分布,可以看到模型表现最差的时候是什么水平,如果最差的情况都可以接受,那模型效果就合格了。
# 选择变量
y=churn['flag']
x=churn[['contract_month','internet_other','streamingtv']]

# 切分训练集与测试集
from sklearn.cross_validation import train_test_split
for i in range(1000):
	X_train, X_test, y_train, y_test = train_test_split(x,y, test_size=0.3)  # 不要设置随机种子random_state保证每次划分的随机性
2.k折交叉验证(K-fold)
  • 一般取10
  • 适用:数据量足够
  • 缺点:k越大越好,但是计算负担大。对数据集的大小有很高的要求。如果数据量不是很足够的话,比如把k设成20,可能测试集里面就没有几个数据了。
(1)sklearn.model_selection
from sklearn.model_selection import StratifiedKFold
sk=StratifiedKFold(n_splits=5,shuffle=True,random_state=0)  
# shuffle=True:先打乱顺序再做划分
# random_state=0(固定值就可以),保证每次的拆分结果是相同的

X_data = Train_data[feature_cols]
Y_data = Train_data['price']

# 将训练集拆分成训练集和验证集validation
for train_ind,val_ind in sk.split(X_data,Y_data):
    train_x=X_data.iloc[train_ind].values
    train_y=Y_data.iloc[train_ind]
    val_x=X_data.iloc[val_ind].values
    val_y=Y_data.iloc[val_ind]
(2)sklearn.cross_validation
from sklearn.cross_validation import KFold
kf = KFold(25, n_folds=5, shuffle=False)
# 其他同上
(3)sklearn.cross_validation
from sklearn.cross_validation import cross_val_score
scores = cross_val_score(knn, X, y, cv=10, scoring='accuracy')
print(scores.mean())
3.自助法bootstrap
  • 问题:改变了初始数据的分布,引入了估计偏差,也就是用改变数据分布带来的误差来弥补数据量少带来的误差。
  • 适用:数据集较小,难以有效划分训练和测试集
  • 3
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以帮您解答这个问题。首先需要说明的是,wine数据集是一个非常常见的用于分类的数据集,它包含了红酒和白酒的化学成分指标,以及对应的评分。在这个问题中,我们需要使用Python和scikit-learn来对wine数据集进行分类。 首先,我们需要导入相关的库和数据集: ```python from sklearn.datasets import load_wine from sklearn.model_selection import train_test_split from sklearn.tree import DecisionTreeClassifier from sklearn.metrics import accuracy_score wine = load_wine() X = wine.data y = wine.target ``` 这里使用了load_wine()函数来加载wine数据集,然后将数据集分为特征和目标两个部分。接下来,我们需要将数据集分为训练集和测试集: ```python X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) ``` 这里使用了train_test_split()函数来将数据划分为训练集和测试集,其中test_size参数表示测试集所占比例,random_state参数表示随机数生成器的种子,保证每次划分结果一致。 接下来,我们使用决策树分类器来训练模型: ```python clf = DecisionTreeClassifier() clf.fit(X_train, y_train) ``` 这里使用了DecisionTreeClassifier()函数来创建一个决策树分类器,并使用fit()函数来训练模型。 最后,我们可以使用测试集来评估模型的准确率: ```python y_pred = clf.predict(X_test) accuracy = accuracy_score(y_test, y_pred) print("Accuracy:", accuracy) ``` 这里使用了predict()函数来对测试集进行预测,并使用accuracy_score()函数来计算准确率。 希望这个回答能够帮助您解决问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值