机器学习(周志华)课后题 第三章 线性模型 3.4

比较10折交叉验证法和留一法

加载函数包和数据集

from sklearn.model_selection import KFold,LeaveOneOut # 交叉验证所需的子集划分方法
from sklearn.linear_model.logistic import LogisticRegression
from sklearn import datasets  # 自带数据集
import numpy as np
iris = datasets.load_iris()  # 加载数据集
print('样本集大小:',iris.data.shape,iris.target.shape)

定义交叉验证函数

def partition(k, X, y, Model, Method):
    # Random seed: reproducibility
    np.random.seed(1)

    # accuracy score
    train_accuracy = [0 for i in range(k)]
    test_accuracy = [0 for i in range(k)]

    # index
    idx = 0

    if Method == 'KFold':#k折交叉验证法(k=10)
        m = KFold(n_splits=k, shuffle=True)
    if Method == 'LeaveOneOut':#留一法
        m = LeaveOneOut()

    # Generate the sets
    for train_index, test_index in m.split(X):
        # Iteration number
        # print(train_index,len(train_index))
        X_train, X_test = X[train_index], X[test_index]
        y_train, y_test = y[train_index], y[test_index]

        # Calling the function/model
        if Model == "Logit":
            clf = LogisticRegression(random_state=0)

        # Fit the model
        clf = clf.fit(X_train, y_train)
        y_train_pred = clf.predict(X_train)
        y_test_pred = clf.predict(X_test)

        train_accuracy[idx] = np.mean(y_train_pred == y_train)
        test_accuracy[idx] = np.mean(y_test_pred == y_test)
        idx += 1

    return train_accuracy, test_accuracy

进行对率回归

10折交叉验证法

train_acc,test_acc = partition(10,iris.data,iris.target,"Logit",'KFold')
print(np.mean(train_acc),np.mean(test_acc))

0.9607407407407406 0.9466666666666667

留一法

train_acc,test_acc = partition(len(iris.target),iris.data,iris.target,"Logit",'LeaveOneOut')
print(np.mean(train_acc),np.mean(test_acc))

0.9626845637583892 0.9533333333333334

1. 什么是泛化能力?泛化能力和过拟合之间有什么关系? 泛化能力是指模型在新的、未见过的数据上的表现能力。模型的泛化能力与其对训练数据的拟合程度有关,通常来说,过拟合的模型泛化能力较差。 2. 什么是交叉验证?交叉验证的作用是什么? 交叉验证是一种通过将数据集分成若干个子集来进行模型评估的方法。具体地,将数据集分成k个子集,每个子集都轮流作为测试集,其余子集作为训练集,重复k次,最终得到k个模型的评估结果的平均值。交叉验证的作用是提高模型评估的可靠性和泛化能力。 3. 留出法、k折交叉验证和留一法的区别是什么?它们各自适用于什么情况? 留出法是将数据集分成两部分,一部分作为训练集,另一部分作为测试集。留出法适用于数据集较大的情况。 k折交叉验证是将数据集分成k个子集,每个子集都轮流作为测试集,其余子集作为训练集,重复k次,最终得到k个模型的评估结果的平均值。k折交叉验证适用于数据集较小的情况。 留一法是k折交叉验证的一种特殊情况,即将数据集分成n个子集,每个子集都作为测试集,其余子集作为训练集,重复n次。留一法适用于数据集较小且样本数较少的情况。 4. 为什么要对数据进行预处理?数据预处理的方法有哪些? 数据预处理可以提高模型的表现,并且可以减少过拟合的风险。数据预处理的方法包括:标准化、归一化、缺失值填充、特征选择、特征降维等。 5. 什么是特征选择?特征选择的方法有哪些? 特征选择是指从所有特征中选择出对模型预测结果有重要贡献的特征。特征选择的方法包括:过滤式方法、包裹式方法和嵌入式方法。其中,过滤式方法是基于特征间的关系进行特征选择,包裹式方法是基于模型的性能进行特征选择,嵌入式方法是将特征选择嵌入到模型训练中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值