Advertisement

机器学习(十)-逻辑回归实践篇之乳腺癌肿瘤预测

阅读量:

逻辑回归实践篇之乳腺癌肿瘤预测

  • 1 本节概述了项目的整体架构与核心功能设计。

  • 本节详细分析了项目的运行机制及其在实际应用中的表现。

  • 在数据预处理阶段,我们对原始数据进行了标准化处理以确保后续分析的有效性。

  • 数据可视化模块旨在通过直观的图形展示帮助用户理解数据特征。

  • 非训练型模型适用于快速预测场景下的应用开发。

  • 基于样本训练的模型则能够提供更高的预测精度。

  • 完整的源代码实现为用户提供了一个完整的参考框架。

    • 3 参考博客

注: 本篇博客为《Python机器学习及实践:从零通往Kaggle竞赛之路》一书逻辑回归案例的笔记,欢迎与我交流数据挖掘、机器学习相关话题。

1 项目描述

"良/恶性"乳腺癌肿瘤预测研究归类为一种二元分类问题。该研究涉及两类样本:包括良性乳腺癌肿瘤及恶性乳腺癌肿瘤。通常采用离散数值来标识类别归属,在本案例中采用数值编码策略:标记为数值0表示良性样本;数值1则表示恶性样本。

数据信息及含义如下图所示:

在这里插入图片描述

数据集下载

2 项目分析

2.1 数据预处理

在本项目案例中仅选取了两个关键指标, 通过图像直观展示肿瘤样本在二维特征空间中的分布情况, 如图所示. 其中X标记恶性肿瘤样本,O标记良性肿瘤样本.

复制代码
    def load_data():
    """
    加载数据集中的数据
    :return:
    """
    # 将训练集读取进来并存至变量df_train
    df_train = pd.read_csv('./data/breast-cancer-train.csv')
    # 将测试集读取进来并存至变量df_test
    df_test = pd.read_csv('./data/breast-cancer-test.csv')
    
    # 选取Clump Thickness(肿瘤厚度)和Cell Size(细胞尺寸)作为特征,构建测试集中的正负分类样本
    df_test_negative = df_test.loc[df_test['Type'] == 0][['Clump Thickness', 'Cell Size']]
    df_test_positive = df_test.loc[df_test['Type'] == 1][['Clump Thickness', 'Cell Size']]
    
    return df_train, df_test, df_test_negative, df_test_positive
    
    
    
    if __name__ == '__main__':
    df_train, df_test, df_test_negative, df_test_positive = load_data()
    print(df_train)
    print(df_test)
    print(df_test_negative)
    print(df_test_positive)

2.2 数据可视化

在本项目案例中仅选取了两个特征,在二维特征空间中利用图像展示了肿瘤样本的分布情况,请参考下图以获得详细信息。X标记恶性肿瘤,O标记良性肿瘤

复制代码
    
    def configure_plt(plt):
    """
    配置图形的坐标表信息
    """
    # 获取当前的坐标轴, gca = get current axis
    ax = plt.gca()
    # 设置x轴, y周在(0, 0)的位置
    ax.spines['bottom'].set_position(('data', 0))
    ax.spines['left'].set_position(('data', 0))
    
    # 设置坐标轴的取值范围
    plt.xlim((0, 15))
    plt.ylim((-10, 20))
    
    # 绘制x,y轴说明
    plt.xlabel('Clump Thickness')
    plt.ylabel('Cell Size')
    return  plt
    
    
    def draw_pic():
    """
    绘制恶性肿瘤和良性肿瘤的图形
    :return:
    """
    df_train, df_test, df_test_negative, df_test_positive = load_data()
    
    import matplotlib.pyplot as plt
    # 绘制图中的良性肿瘤样本点,标记为红色的o
    plt.scatter(df_test_negative['Clump Thickness'], df_test_negative['Cell Size'], marker='o', s=200, c='red')
    # 绘制图中的恶心肿瘤样本点,标记为黑色的x
    plt.scatter(df_test_positive['Clump Thickness'], df_test_positive['Cell Size'], marker='x', s=150, c='black')
    
    	plt = configure_plt(plt)
    	
    # 显示图
    plt.show()
    
    if __name__ == '__main__':
    draw_pic()
在这里插入图片描述

2.3 拟合模型(非训练型)

随后我们随机初始化了一个二类分类器这一分类器使用一条直线作为区分良恶性肿瘤的标准决定这条分界面走向的因素包括两个方面一是分界面方程中的斜率系数二是截距项这些参数则被我们定义为模型的核心参数同样地在监督学习过程中这些参数需要根据训练数据进行优化其性能表现如图所示

复制代码
    def init_model():
    """
    初始化模型的参数,
    随机初始化一个二类分类器,这个分类器用一条直线来划分良/恶性肿瘤。决定这条直线的走向有两个因素:直线的斜率和截距。
    :return:
    """
    # 利用numpy中的random函数随机采样直线的截距和系数
    intercept = np.random.random([1])
    coef = np.random.random([2])
    
    lx = np.arange(0, 12)
    ly = (-intercept - lx * coef[0]) / coef[1]
    return  lx, ly
    
    
    def draw_pic():
    """
    绘制恶性肿瘤和良性肿瘤的图形
    :return:
    """
    df_train, df_test, df_test_negative, df_test_positive = load_data()
    
    import matplotlib.pyplot as plt
    # 绘制图中的良性肿瘤样本点,标记为红色的o
    plt.scatter(df_test_negative['Clump Thickness'], df_test_negative['Cell Size'], marker='o', s=200, c='red')
    # 绘制图中的恶心肿瘤样本点,标记为黑色的x
    plt.scatter(df_test_positive['Clump Thickness'], df_test_positive['Cell Size'], marker='x', s=150, c='black')
    
    # **************************************************新加的部分******************
    # 绘制初始化模型参数的随机直线
    lx, ly = init_model()
    plt.plot(lx, ly, c='yellow')
    
    	plt = configure_plt(plt)
    
    # 显示图
    plt.show()
    
    
    if __name__ == '__main__':
    draw_pic()
在这里插入图片描述

2.4 拟合模型(样本训练)

随后我们使用适量训练样本,在后续过程中对分类器的表现进行了显著提升,并通过下图展示了这一结果。

复制代码
    def train_model(df_train, df_test):
    """
    使用一定量训练样本来训练模型
    :return:
    """
    import  warnings
    warnings.filterwarnings('ignore')
    lr = LogisticRegression()
    
    # 使用前10条训练样本学习直线的系数和截距
    lr.fit(df_train[['Clump Thickness', 'Cell Size']], df_train['Type'])
    print('模型准确率:%.2f%%' %(lr.score(df_test[['Clump Thickness', 'Cell Size']], df_test['Type'])*100 ))
    intercept = lr.intercept_
    coef = lr.coef_[0, :]
    lx = np.arange(0, 12)
    # 原本这个分类面应该是lx*coef[0] + ly*coef[1] + intercept=0 映射到2维平面上之后,应该是:
    ly = (-intercept - lx * coef[0]) / coef[1]
    return  lx, ly
    
    
    
    
    def draw_pic():
    """
    绘制恶性肿瘤和良性肿瘤的图形
    :return:
    """
    df_train, df_test, df_test_negative, df_test_positive = load_data()
    
    import matplotlib.pyplot as plt
    # 绘制图中的良性肿瘤样本点,标记为红色的o
    plt.scatter(df_test_negative['Clump Thickness'], df_test_negative['Cell Size'], marker='o', s=200, c='red')
    # 绘制图中的恶心肿瘤样本点,标记为黑色的x
    plt.scatter(df_test_positive['Clump Thickness'], df_test_positive['Cell Size'], marker='x', s=150, c='black')
    
    
    # 绘制初始化模型参数的随机直线
    lx, ly = init_model()
    plt.plot(lx, ly, c='yellow')
    
    ## **************************************************新加的部分******************
    # 训练之后的模型数据
    lx, ly = train_model(df_train, df_test)
    plt.plot(lx, ly, c='green')
    
    plt = configure_plt(plt)
    
    # 显示图
    plt.show()
    
    
    if __name__ == '__main__':
    draw_pic()
在这里插入图片描述
在这里插入图片描述

2.4 完整源代码

复制代码
    """
    文件名: breast-cancer-predict.py
    创建时间: 2019-04-26 10:
    作者: lvah
    联系方式: 976131979@qq.com
    代码描述:
    
    
    项目描述:
    “良/恶性乳腺癌肿瘤预测”的问题属于二分类任务。
    待预测的类别分别是良性乳腺癌肿瘤和恶性乳腺癌肿瘤。
    通常使用离散的整数来代表类别, 0代表良性,1代表恶性。
    
    
    
    
    """
    
    import pandas as pd
    import  numpy as np
    from sklearn.linear_model import LogisticRegression
    
    
    def load_data():
    """
    加载数据集中的数据
    :return:
    """
    # 将训练集读取进来并存至变量df_train
    df_train = pd.read_csv('./data/breast-cancer-train.csv')
    # 将测试集读取进来并存至变量df_test
    df_test = pd.read_csv('./data/breast-cancer-test.csv')
    
    # 选取Clump Thickness(肿瘤厚度)和Cell Size(细胞尺寸)作为特征,构建测试集中的正负分类样本
    df_test_negative = df_test.loc[df_test['Type'] == 0][['Clump Thickness', 'Cell Size']]
    df_test_positive = df_test.loc[df_test['Type'] == 1][['Clump Thickness', 'Cell Size']]
    
    return df_train, df_test, df_test_negative, df_test_positive
    
    
    def init_model():
    """
    初始化模型的参数,
    随机初始化一个二类分类器,这个分类器用一条直线来划分良/恶性肿瘤。决定这条直线的走向有两个因素:直线的斜率和截距。
    :return:
    """
    # 利用numpy中的random函数随机采样直线的截距和系数
    intercept = np.random.random([1])
    coef = np.random.random([2])
    
    lx = np.arange(0, 12)
    ly = (-intercept - lx * coef[0]) / coef[1]
    return  lx, ly
    
    
    def train_model(df_train, df_test):
    """
    使用一定量训练样本来训练模型
    :return:
    """
    import  warnings
    warnings.filterwarnings('ignore')
    lr = LogisticRegression()
    
    # 使用前10条训练样本学习直线的系数和截距
    lr.fit(df_train[['Clump Thickness', 'Cell Size']], df_train['Type'])
    print('模型准确率:%.2f%%' %(lr.score(df_test[['Clump Thickness', 'Cell Size']], df_test['Type'])*100 ))
    intercept = lr.intercept_
    coef = lr.coef_[0, :]
    lx = np.arange(0, 12)
    # 原本这个分类面应该是lx*coef[0] + ly*coef[1] + intercept=0 映射到2维平面上之后,应该是:
    ly = (-intercept - lx * coef[0]) / coef[1]
    return  lx, ly
    
    
    
    def configure_plt(plt):
    """
    配置图形的坐标表信息
    """
    # 获取当前的坐标轴, gca = get current axis
    ax = plt.gca()
    # 设置x轴, y周在(0, 0)的位置
    ax.spines['bottom'].set_position(('data', 0))
    ax.spines['left'].set_position(('data', 0))
    
    # 设置坐标轴的取值范围
    plt.xlim((0, 15))
    plt.ylim((-10, 20))
    
    # 绘制x,y轴说明
    plt.xlabel('Clump Thickness')
    plt.ylabel('Cell Size')
    return  plt
    
    def draw_pic():
    """
    绘制恶性肿瘤和良性肿瘤的图形
    :return:
    """
    df_train, df_test, df_test_negative, df_test_positive = load_data()
    
    import matplotlib.pyplot as plt
    # 绘制图中的良性肿瘤样本点,标记为红色的o
    plt.scatter(df_test_negative['Clump Thickness'], df_test_negative['Cell Size'], marker='o', s=200, c='red')
    # 绘制图中的恶心肿瘤样本点,标记为黑色的x
    plt.scatter(df_test_positive['Clump Thickness'], df_test_positive['Cell Size'], marker='x', s=150, c='black')
    
    
    # 绘制初始化模型参数的随机直线
    lx, ly = init_model()
    plt.plot(lx, ly, c='yellow')
    
    ## **************************************************新加的部分******************
    # 训练之后的模型数据
    lx, ly = train_model(df_train, df_test)
    plt.plot(lx, ly, c='green')
    
    plt = configure_plt(plt)
    
    # 显示图
    plt.show()
    
    
    if __name__ == '__main__':
    draw_pic()

3 参考博客

Python机器学习及实践——第三期——逻辑回归入门

全部评论 (0)

还没有任何评论哟~