【机器学习小实验2】逻辑回归实例-乳腺癌肿瘤预测

2024-05-28 1324阅读

文章目录

  • 一、实验目的
  • 二、代码及结果
  • 三、结果分析
  • 四、实验总结

    ###实验所需的数据以及源码下载###

    一、实验目的

    1.熟悉逻辑回归原理掌握sklearn逻辑回归相关API。

    2.掌握LogisticRegression函数和LogisticRegressionCV的调用和调参。

    3.掌握交叉验证的使用。

    二、代码及结果

    1.查看数据集基本信息,去掉异常符号。

    粘贴代码:

    import pandas as pd
    import numpy as np
    from sklearn.model_selection import train_test_split  
    from sklearn.preprocessing import StandardScaler
    from sklearn.linear_model import LogisticRegression
    from sklearn.linear_model import LogisticRegressionCV
    from sklearn.metrics import classification_report,accuracy_score
    from sklearn.model_selection import cross_val_score, KFold
    import matplotlib.pyplot as plt
    from sklearn.metrics import precision_recall_curve, auc
    from sklearn.metrics import roc_curve, auc
    column_names = ['Sample code number','Clump Thickness','Uniformity of Cell Size','Uniformity of Cell Shape','Marginal Adhesion','Single Epithelial Cell Size','Bare Nuclei','Bland Chromatin','Normal Nucleoli','Mitoses','Class']
    dataFrame = pd.read_csv("./breast-cancer-wisconsin.data",names = column_names)
    dataFrame.head()
    dataFrame.info()
    # 将?替换成标准缺失值表示
    dataFrame = dataFrame.replace('?',value = np.nan)
    # 丢弃带有缺失值的数据
    dataFrame = dataFrame.dropna(how='any')
    dataFrame.shape
    

    结果:

    【机器学习小实验2】逻辑回归实例-乳腺癌肿瘤预测

    2.根据notebook提示实验,sklearn中与逻辑回归有关的函数LogisticRegression函数和LogisticRegressionCV函数的默认参数补全代码。

    粘贴代码:

    # 3.准备训练测试数据
    # 数据中第一列到第九列为输入X
    X = dataFrame[column_names[1:10]]
    # 第十列为标签y
    y = dataFrame[column_names[10]]
    # 将目标变量转换为 {0, 1}
    y = np.where(y == 4, 1, 0)
    X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.25,random_state=42)
    # 4. 标准化数据
    # 标准化数据,保证每个维度的特征数据方差为1,均值为0。使得预测结果不会被某些维度过大的特征值而主导
    sc = StandardScaler()
    X_train = sc.fit_transform(X_train)
    X_test = sc.transform(X_test)
    # 调用linear_model.LogisticRegression模型进行建模
    lr = LogisticRegression()
    # 调用fit函数训练模型,确定参数
    lr.fit(X_train,y_train)
    # 调用predict函数进行预测,得到y_predict,并打印出y_predict
    y_predict = lr.predict(X_test)
    # 输出测试个数和预测正确的个数
    print("测试个数:",len(y_test))
    count = 0
    for i in range(len(y_test)):
        if y_predict[i] == y_test[i]:
            count += 1
    print("预测正确个数:",count)
    # 调用coef_得到预测模型的系数,应该有9个系数,并打印出来
    print("预测模型的系数:",lr.coef_)
    print("测试集预测结果:",y_predict)
    # 使用score函数得到测试数据的准确率,并打印
    #print("准确率:",accuracy_score(y_test,y_predict))
    print("准确率:",lr.score(X_test,y_test))
    # 调用metrics中的classification_report函数输入y_test和y_predict查看查准率和查重率
    print("查准率与查全率:",classification_report(y_test,y_predict,labels = [0,1],target_names=["良性","恶性"]))
    

    3.运行上述默认参数代码即LogisticRegression()和LogisticRegressionCV()的默认参数,根据要求打印两种实验结果。

    打印测试数据个数和预测正确个数,打印权重、准确率、预测结果和查准率与查重率:

    粘贴代码:

    # 调用linear_model.LogisticRegression模型进行建模
    lr = LogisticRegression()
    # 调用fit函数训练模型,确定参数
    lr.fit(X_train,y_train)
    # 调用predict函数进行预测,得到y_predict,并打印出y_predict
    y_predict = lr.predict(X_test)
    # 输出测试个数和预测正确的个数
    print("测试个数:",len(y_test))
    count = 0
    for i in range(len(y_test)):
        if y_predict[i] == y_test[i]:
            count += 1
    print("预测正确个数:",count)
    # 调用coef_得到预测模型的系数,应该有9个系数,并打印出来
    print("预测模型的系数:",lr.coef_)
    print("测试集预测结果:",y_predict)
    # 使用score函数得到测试数据的准确率,并打印
    #print("准确率:",accuracy_score(y_test,y_predict))
    print("准确率:",lr.score(X_test,y_test))
    # 调用metrics中的classification_report函数输入y_test和y_predict查看查准率和查重率
    print("查准率与查全率:",classification_report(y_test,y_predict,labels = [0,1],target_names=["良性","恶性"]))
    lrcv = LogisticRegressionCV()
    lrcv.fit(X_train,y_train)
    y_predict_cv = lrcv.predict(X_test)
    # 输出测试个数和预测正确的个数
    print("cv测试个数:",len(y_test))
    count = 0
    for i in range(len(y_test)):
        if y_predict_cv[i] == y_test[i]:
            count += 1
    print("cv预测正确个数:",count)
    # 调用coef_得到预测模型的系数,应该有9个系数,并打印出来
    print("cv预测模型的系数:",lrcv.coef_)
    print("cv测试集预测结果:",y_predict_cv)
    # 使用score函数得到测试数据的准确率,并打印
    #print("cv准确率:",accuracy_score(y_test,y_predict_cv))
    print("cv准确率:",lrcv.score(X_test,y_test))
    # 调用metrics中的classification_report函数输入y_test和y_predict查看查准率和查重率
    print("cv查准率与查全率:",classification_report(y_test,y_predict_cv,labels = [0,1],target_names=["良性","恶性"]))
    

    运行结果:

    【机器学习小实验2】逻辑回归实例-乳腺癌肿瘤预测

    【机器学习小实验2】逻辑回归实例-乳腺癌肿瘤预测

    4.以2为例,使用不同参数C(正则化强度倒数)的LogisticRegression函数进行实验,设置C=0.1和0.01进行实验。实验结果按照上述要求打印两种实验结果。

    打印结果:

    【机器学习小实验2】逻辑回归实例-乳腺癌肿瘤预测

    【机器学习小实验2】逻辑回归实例-乳腺癌肿瘤预测

    5.绘制ROC曲线:

    粘贴代码:

    # 获取预测概率
    y_scores = lr.predict_proba(X_test)[:, 1]
    fpr, tpr, thresholds = roc_curve(y_test, y_scores)
    auc =roc_auc_score(y_test, y_scores)
    plt.figure()
    lw = 2
    plt.plot(fpr, tpr, color='darkorange',
             lw=lw, label='ROC curve (area = %0.2f)' % auc)
    plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')
    plt.xlim([0.0, 1.0])
    plt.ylim([0.0, 1.05])
    plt.xlabel('False Positive Rate')
    plt.ylabel('True Positive Rate')
    plt.title('Receiver operating characteristic example')
    plt.legend(loc="lower right")
    plt.show()
    

    运行结果:

    【机器学习小实验2】逻辑回归实例-乳腺癌肿瘤预测

    6.进行十折交叉验证。

    粘贴代码:

    #法一:
    score = 0
    kfold = KFold(n_splits=10)
        
    for train_index, test_index in kfold.split(X,y):
        
        # train_index 就是分类的训练集的下标,test_index 就是分配的验证集的下标
        train_x, test_x = X.iloc[train_index], X.iloc[test_index]  
        train_y, test_y = y[train_index], y[test_index]  
        
        # 训练本组的数据,并计算准确率
        # 调用linear_model.LogisticRegression模型进行建模
        lr = LogisticRegression()
        # 调用fit函数训练模型,确定参数
        lr.fit(train_x,train_y)
        prediction = lr.predict(test_x)
        score += lr.score(test_x, test_y)
        
    print("模型的平均准确率为:",score/10)
    #法二:
    #进行十折交叉验证
    kf = KFold(n_splits=10)
    lr = LogisticRegression()
    precision_scores = cross_val_score(lr, X, y, cv=kf, scoring='accuracy')
    precision_mean = np.mean(precision_scores)
        
    print(f'Average accuracy: {precision_mean:.6f}')
    

    运行结果:

    【机器学习小实验2】逻辑回归实例-乳腺癌肿瘤预测

    三、结果分析

    1.LogisticRegression 和 LogisticRegressionCV 的对比:

    LogisticRegression 的准确率为 0.9532,而 LogisticRegressionCV 的准确率为 0.9357。这两者的准确率相差不大,但 LogisticRegression 稍高。这可能表明在这个问题上,默认的 LogisticRegression 参数效果较好,不需要通过交叉验证选择正则化强度。

    2.不同正则化参数 C 的实验:

    对于 C=0.1,准确率为 0.9415,而对于 C=0.01,准确率为 0.9181。这表明在这个问题上,较小的正则化强度(C=0.01)可能导致一些过拟合,准确率较低。而 C=0.1 提供了一个较好的平衡,提高了模型的性能。

    3.十折交叉验证的结果:

    十折交叉验证模型的平均精确率为 0.9679,这是一个相对较高的值。这表明模型在不同的训练集和验证集上都表现得很好,具有较好的泛化能力。

    四、实验总结

    在这个乳腺癌肿瘤预测问题上,使用默认参数的 LogisticRegression 在测试集上表现较好。通过 LogisticRegressionCV 进行正则化参数选择,虽然准确率略低,但也能得到可接受的性能。通过调整正则化参数 C,发现在此问题上 C=1 的性能最好。

    实验结果表明,逻辑回归在这个二分类问题上表现良好,具有较高的准确率。

    十折交叉验证的结果强化了模型的鲁棒性和泛化能力。可能的改进方向有以下两个:一是进一步尝试不同的特征工程方法,或者考虑特征选择,以优化模型的输入。二是可以尝试其他分类算法,比较它们在这个问题上的性能,寻找更好的模型。

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]