机器学习案例3:基于逻辑回归的肿瘤预测

案例3:基于逻辑回归的肿瘤预测

为什么写本博客

​ 前人种树,后人乘凉。希望自己的学习笔记可以帮助到需要的人。

需要的基础

​ 懂不懂原理不重要,本系列的目标是使用python实现机器学习。

​ 必须会的东西:python基础、numpy、pandas、matplotlib和库的使用技巧。

说明

​ 完整的代码在最后,另外之前案例中出现过的方法不会再讲解。

目录结构

文章目录

    • 案例3:基于逻辑回归的肿瘤预测
      • 1. 涉及到的新方法:
      • 2. 数据介绍:
      • 3. 数据加载与处理:
      • 4. 模型创建、训练和评估:
      • 5. 总结与完整代码:

1. 涉及到的新方法:

模型创建

# 导入模型
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()

2. 数据介绍:

​ 这次使用的数据需要在网上下载,下载到本地的data文件夹内,代码文件就在data文件夹外,与之同级别(重要),网址为https://archive.ics.uci.edu/ml/machine-learning-databases/,我们使用的数据为:

机器学习案例3:基于逻辑回归的肿瘤预测_第1张图片

​ 其中,后缀为data的为数据文件,names对属性进行说明的文件。

​ 这个**数据共699条,共9个特征,一个索引id(第一列),一个肿瘤类型标签(最后一列)**具体的数据内容为:

1000025,5,1,1,1,2,1,3,1,1,2
# 索引id(没啥用),除去最后一列外的为肿瘤特征,最后一列为肿瘤的类型值

这个数据具有缺失值,缺失值使用?表示,缺失值共16条

3. 数据加载与处理:

​ 这里,我们使用pandas来加载数据,首先定义一个列表,其内容为数据的标签:

# 定义标签
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']

​ 接着,使用pandas加载数据并显示前五条数据:

# 导入数据
data = pd.read_csv('./data/breast-cancer-wisconsin.data',names=names)
print(data.head())
print(data.shape) # (699, 11)

​ 结果如下:

   Sample code number  Clump Thickness  ...  Mitoses  Class
0             1000025                5  ...        1      2
1             1002945                5  ...        1      2
2             1015425                3  ...        1      2
3             1016277                6  ...        1      2
4             1017023                4  ...        1      2
(699, 11)

​ 下面,我们对缺失值进行处理,这里我们采取的简单处理,就是丢弃相关的数据即可:

# 缺失值丢失
data = data.replace(to_replace='?',value=np.NaN)
data = data.dropna()
print(data.shape) # (683, 11)

​ 然后,我们需要把数据分开一下,即将特征提取出来,把标签页提取出来:

# 数据处理
x = data.iloc[:,1:10]
y = data.iloc[:,10]

​ 然后,对数据集进行切分,按照8:2的比列分为训练集和测试集:

# 数据分割
x_train,x_test,y_train,y_test = model_selection.train_test_split(x,y,test_size=0.2,random_state=20)
print(x_train.shape) # (546, 9)
print(y_train.shape) #(546,)

​ 最后,将数据进行标准化即可:

# 标准化
standard = preprocessing.StandardScaler()
x_train = standard.fit_transform(x_train)
x_test = standard.fit_transform(x_test)

4. 模型创建、训练和评估:

​ 首先,创建模型和训练模型:

# 创建模型
model = LogisticRegression()
model.fit(x_train,y_train)

​ 然后,进行评估:

# 评估
y_pred = model.predict(x_test)
print('预测值:',y_pred)
score = model.score(x_test,y_test)
print('准确率:',score)

​ 结果:

预测值: [4 2 2 2 2 2 2 2 2 2 2 2 2 2 2 4 4 4 2 4 2 2 4 2 2 4 2 4 4 4 2 2 4 2 2 2 4
 2 4 2 4 2 4 2 2 2 4 2 2 2 2 2 2 2 2 2 2 4 4 2 4 4 4 2 2 4 2 4 4 4 4 2 2 2
 2 2 4 2 2 4 2 4 2 2 2 2 2 2 2 2 2 4 2 2 2 2 4 4 2 4 2 2 2 2 4 2 4 2 4 2 2
 2 2 2 2 2 2 2 2 2 2 2 2 2 4 2 4 4 2 4 2 2 2 2 4 2 4]
准确率: 0.9562043795620438

​ **提醒一句:**对于这种分类来说,其实我们并不关注准确率,毕竟是医疗数据,我们更加关注的是对于肿瘤患者,我们是不是可以百分百预测出来,否则这个代码就没有太大的意义。

5. 总结与完整代码:

​ 逻辑回归是一个常用的二分类算法,除去上面的实现方法外,还有一个常用的实现方法**就是基于梯度下降算法来实现。**不过,结果都差不多,因此这里没有演示,如果后面有需要可以补充一下相关代码。

​ 完整代码:

# author: baiCai
# 导包
import pandas as pd
import numpy as np
from sklearn import preprocessing
from sklearn import model_selection
from sklearn.linear_model import LogisticRegression
# 定义标签
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']
# 导入数据
data = pd.read_csv('./data/breast-cancer-wisconsin.data',names=names)
# print(data.head())
# print(data.shape) # (699, 11)
# 缺失值丢失
data = data.replace(to_replace='?',value=np.NaN)
data = data.dropna()
# print(data.shape) #(683, 11)
# 数据处理
x = data.iloc[:,1:10]
y = data.iloc[:,10]
# 数据分割
x_train,x_test,y_train,y_test = model_selection.train_test_split(x,y,test_size=0.2,random_state=20)
# print(x_train.shape) # (546, 9)
# print(y_train.shape) #(546,)
# 标准化
standard = preprocessing.StandardScaler()
x_train = standard.fit_transform(x_train)
x_test = standard.fit_transform(x_test)
# 创建模型
model = LogisticRegression()
model.fit(x_train,y_train)
# 评估
y_pred = model.predict(x_test)
print('预测值:',y_pred)
score = model.score(x_test,y_test)
print('准确率:',score)

你可能感兴趣的:(机器学习案例,逻辑回归,python)