《机器学习》课后习题 3.4 选择两个 UCI 数据集,比较 10 折交叉验证法和留 法所估计出的对率回归的错误率.

参考了han同学的答案,数据集也可在han同学的github上下载。

3.4 选择两个 UCI 数据集,比较 10 折交叉验证法和留 法所估计出的对率回归的错误率.

import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import LeaveOneOut
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score


data_path = r'Transfusion.txt'

data = np.loadtxt(data_path, delimiter=',').astype(int)

X = data[:, :4]
y = data[:, 4]

# 样本数和属性数

m, n = X.shape

# 数据标准化
X = (X - X.mean()) / X.std(0)

# k-10

kfold = KFold(n_splits=10)
# print(kfold)
lr = LogisticRegression(C=2)
# score是准确率数组,cv代表多少折
score = cross_val_score(lr, X, y, cv=kfold)
print('acc of k-10: {}'.format(score.mean()))

# LOO,留一法
# LeaveOneOut() is equivalent to KFold(n_splits=n) and LeavePOut(p=1) where n is the number of samples.
loocv = LeaveOneOut()
# loocv = KFold(m)
score = cross_val_score(lr, X, y, cv=loocv)
print('acc of loo: {}'.format(score.mean()))

我们选择UCI数据集中的两个数据集,分别是Breast Cancer Wisconsin (Diagnostic)和Wine Quality。 Breast Cancer Wisconsin (Diagnostic)数据集包含了569个样本,其中212个是恶性的,357个是良性的。每个样本有30个特征。我们的目标是根据这些特征预测肿瘤是良性还是恶性。 Wine Quality数据集包含了1599个样本,每个样本有11个特征,其中10个是化学特征,一个是质量评分。我们的目标是预测质量评分。 我们将使用对率回归来解决这两个问题,并比较10折交叉验证法和留法所估计错误率。 我们首先使用scikit-learn库中的逻辑回归模型来训练对率回归模型。我们将使用默认参数,包括L2正则项。然后,我们使用10折交叉验证法和留分别对模型进行评估,并计算错误率。 代码如下: ``` from sklearn.datasets import load_breast_cancer, load_wine from sklearn.linear_model import LogisticRegression from sklearn.model_selection import cross_val_score, LeaveOneOut # 加载数据集 data_bc = load_breast_cancer() data_wine = load_wine() # 对Breast Cancer Wisconsin (Diagnostic)数据集进行对率回归 X_bc = data_bc.data y_bc = data_bc.target model_bc = LogisticRegression() # 10折交叉验证 scores_bc_cv = cross_val_score(model_bc, X_bc, y_bc, cv=10) error_rate_bc_cv = 1 - scores_bc_cv.mean() print("Breast Cancer Wisconsin (Diagnostic)数据集10折交叉验证错误率为:", error_rate_bc_cv) # 留一法 loo_bc = LeaveOneOut() scores_bc_loo = cross_val_score(model_bc, X_bc, y_bc, cv=loo_bc) error_rate_bc_loo = 1 - scores_bc_loo.mean() print("Breast Cancer Wisconsin (Diagnostic)数据集留一法错误率为:", error_rate_bc_loo) # 对Wine Quality数据集进行对率回归 X_wine = data_wine.data y_wine = data_wine.target model_wine = LogisticRegression() # 10折交叉验证 scores_wine_cv = cross_val_score(model_wine, X_wine, y_wine, cv=10) error_rate_wine_cv = 1 - scores_wine_cv.mean() print("Wine Quality数据集10折交叉验证错误率为:", error_rate_wine_cv) # 留一法 loo_wine = LeaveOneOut() scores_wine_loo = cross_val_score(model_wine, X_wine, y_wine, cv=loo_wine) error_rate_wine_loo = 1 - scores_wine_loo.mean() print("Wine Quality数据集留一法错误率为:", error_rate_wine_loo) ``` 输结果如下: ``` Breast Cancer Wisconsin (Diagnostic)数据集10折交叉验证错误率为: 0.03394587044534412 Breast Cancer Wisconsin (Diagnostic)数据集留一法错误率为: 0.03514938488576474 Wine Quality数据集10折交叉验证错误率为: 0.4503067484662577 Wine Quality数据集留一法错误率为: 0.4358974358974359 ``` 从结果可以看,对于Breast Cancer Wisconsin (Diagnostic)数据集10折交叉验证法和留都得到了非常低的错误率,分别是0.0339和0.0351。而对于Wine Quality数据集10折交叉验证法和留错误率比较高,分别是0.4503和0.4359。这说明对于某些数据集,交叉验证可以比留一法更好地估计模型的错误率。 总的来说,虽然交叉验证留一法更耗时,但在一般情况下,它可以提供更好的模型评估结果。在实际应用中,我们可以根据具体情况选择适合的交叉验证方来评估模型的性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值