• 逻辑回归-癌症病预测与不均衡样本评估


    1.注册相关库(在命令行输入)

    1. pip install scikit-learn
    2. pip install pandas
    3. pip install numpy

    2.导入相关库

    1. import pandas as pd
    2. import numpy as np
    3. from sklearn.metrics import classification_report
    4. from sklearn.model_selection import train_test_split
    5. from sklearn.preprocessing import StandardScaler
    6. from sklearn.linear_model import LogisticRegression

    3.读取数据文件,即癌症数据集

    1. #库读取远程的 CSV 文件
    2. data = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data')
    3. data.head()
    4. print(data.head())
    5. #给列名字
    6. names = ['Sample code number', 'Clump Thickness', 'Uniformity of Cell Size', 'Uniformity of Cell Shape','Marginal Adhesion',
    7. 'Single Epithelial Cell Size', 'Bare Nuclei', 'Bland Chromatin','Normal Nucleoli', 'Mitoses', 'Class']
    8. #给data增加一个names参数
    9. data = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data',names = names)
    10. data.Class#说明:2表示良性,4表示恶性
    11. print(data['Class'])

    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:肿瘤类型(良性或恶性)

    4.数据清洗(替换空值)

    1. #替换缺失值
    2. data = data.replace(to_replace='?',value=np.nan)
    3. ## 删除缺失值的样本
    4. data = data.dropna() #删除有np.nan的行

    5.进行训练

    训练集(x_train,y_train):训练集是用于训练机器学习模型的数据集。通常,我们会利用训练集中的已知样本(包括特征值和目标值)来训练模型,并通过优化模型参数来使其适合数据。

    测试集(x_test,y_test):测试集是用于评估机器学习模型性能的数据集。测试集通常由未出现在训练集中的样本组成,用于测试模型是否能够正确推断或预测样本的目标值。

    1. #特征值
    2. x = data.iloc[:,:-1]
    3. x.head()
    4. #目标值
    5. y = data['Class']
    6. y.head()
    7. #表示将数据集中的 20% 作为测试集,剩下的 80% 作为训练集
    8. #:x_train 是训练集的特征值,x_test 是测试集的特征值,y_train 是训练集的目标值,y_test 是测试集的目标值
    9. x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.2)
    10. transform = StandardScaler()#实例化转换器
    11. #标准化
    12. #标准化的目的是将不同尺度和单位的特征值转换为具有统一标准的值,以保证模型能够更好地学习和预测
    13. # 通过标准化,可以使特征值的均值为0,标准差为1,从而使得特征值在相同的尺度范围内,避免不同特征值之间的偏差对模型造成影响,使得不同特征之间可以进行可比较的比较。。
    14. x_train = transform.fit_transform(x_train)
    15. x_test = transform.fit_transform(x_test)
    16. mode= LogisticRegression()#用默认的就行
    17. mode.fit(x_train,y_train)#得到了模型
    18. y_predict = mode.predict(x_test)

    6.模型评估:

    1. #print("y_predict:\n", y_predict)
    2. print("直接比对真实值和预测值:\n", y_test == y_predict)
    3. # 计算准确率
    4. accuracy = mode.score(x_test, y_test)
    5. print("准确率为:\n", accuracy)
    6. #输出混淆矩阵
    7. cm = confusion_matrix(y_test, y_predict, labels=[2, 4])
    8. print("混淆矩阵:\n",cm)
    9. # 打印分类报告
    10. res = classification_report(y_test, y_predict, labels=[2, 4], target_names=['良性', '恶性'])
    11. print(res)

    混淆矩阵:

    当评估一个分类模型的性能时,准确率(precision)、召回率(recall)和F1值是常用的指标。这些指标可以帮助我们理解模型在不同类别上的预测质量。

     准确率(Precision)是指模型在所有被分类为正例的样本中,正确预测为正例的比例。准确率告诉我们被模型预测为正例的样本有多少是真正的正例。它的计算公式如下:

    Precision = TP / (TP + FP)
    

    召回率(Recall)是指在所有实际为正例的样本中,模型正确预测为正例的比例。召回率告诉我们模型有多少能够捕捉到真正的正例。它的计算公式如下:

    Recall = TP / (TP + FN)

    F1值是综合考虑了准确率和召回率的指标,它是准确率和召回率的加权调和平均值。F1值的计算公式如下:

    F1 = 2 * (Precision * Recall) / (Precision + Recall)

    7.完整代码:

    1. import pandas as pd
    2. import numpy as np
    3. from sklearn.metrics import classification_report
    4. from sklearn.model_selection import train_test_split
    5. from sklearn.preprocessing import StandardScaler
    6. from sklearn.linear_model import LogisticRegression
    7. #库读取远程的 CSV 文件
    8. data = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data')
    9. data.head()
    10. print(data.head())
    11. #给列名字
    12. names = ['Sample code number', 'Clump Thickness', 'Uniformity of Cell Size', 'Uniformity of Cell Shape','Marginal Adhesion',
    13. 'Single Epithelial Cell Size', 'Bare Nuclei', 'Bland Chromatin','Normal Nucleoli', 'Mitoses', 'Class']
    14. #给data增加一个names参数
    15. data = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data',names = names)
    16. #print(data.head())
    17. data.Class#说明:2表示良性,4表示恶性
    18. #print(data['Class'])
    19. #替换缺失值
    20. data = data.replace(to_replace='?',value=np.nan)
    21. ## 删除缺失值的样本
    22. data = data.dropna() #删除有np.nan的行
    23. #特征值
    24. x = data.iloc[:,:-1]
    25. x.head()
    26. #目标值
    27. y = data['Class']
    28. y.head()
    29. #表示将数据集中的 20% 作为测试集,剩下的 80% 作为训练集
    30. #:x_train 是训练集的特征值,x_test 是测试集的特征值,y_train 是训练集的目标值,y_test 是测试集的目标值
    31. x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.2)
    32. transform = StandardScaler()#实例化转换器
    33. #标准化
    34. #标准化的目的是将不同尺度和单位的特征值转换为具有统一标准的值,以保证模型能够更好地学习和预测
    35. # 通过标准化,可以使特征值的均值为0,标准差为1,从而使得特征值在相同的尺度范围内,避免不同特征值之间的偏差对模型造成影响。
    36. x_train = transform.fit_transform(x_train)
    37. x_test = transform.fit_transform(x_test)
    38. mode= LogisticRegression()#用默认的就行
    39. mode.fit(x_train,y_train)#得到了模型
    40. y_predict = mode.predict(x_test)
    41. #print("y_predict:\n", y_predict)
    42. print("直接比对真实值和预测值:\n", y_test == y_predict)
    43. # 计算准确率
    44. accuracy = mode.score(x_test, y_test)
    45. print("准确率为:\n", accuracy)
    46. # 打印分类报告
    47. res = classification_report(y_test, y_predict, labels=[2, 4], target_names=['良性', '恶性'])
    48. print(res)

  • 相关阅读:
    petite-vue源码剖析-优化手段template详解
    Spring 统一功能处理(拦截器)
    C++ string 类实现
    web安全渗透
    【K210+ESP8266图传上位机开发】TCP server + JPEG图像解析上位机开发
    【Python入门】文件内容操作
    【HTML+CSS】静态网页设计期末大作业——我的家乡无锡印象
    见证国内人工智能与机器人技术的进步
    Java基础之String和Stringbuilder的区别
    Windows与网络基础-18-注册表基础
  • 原文地址:https://blog.csdn.net/m0_62661752/article/details/134339452