机器学习实战(1)——线性分类器+Logistic回归解决良/恶性乳腺癌肿瘤预测问题

本文参考书《Python机器学习及实践》(范淼 李超 编著)

理论分析

线性分类器

在这里插入图片描述

Logistic回归

在这里插入图片描述

随机梯度上升

数据分析

代码分析

导入数据

数据包文件名为breast-cancer-wisconsin.data,观察数据发现共十一列,699行,十一列中第1列为序号,2-10列是肿瘤参数,第11列是分类标签,因此先建立一个名称数组,用pandas的read_csv()方法读入数据,随后观察数据进行缺失值的处理。

import pandas as pd
import numpy as np

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']
data=pd.read_csv('breast-cancer-wisconsin.data',names=column_names)
data=data.replace(to_replace='?',value=np.nan)
data=data.dropna(how='any')
print(data.shape)

输出的结果是处理后数据的行数和列数。

分割数据集

分割数据集用的是sklearn中的train_test_split模块,我们将数据中的75%用于训练,25%用于测试,代码为:

from sklearn.model_selection import train_test_split

X_train,X_test,y_train,y_test=train_test_split(data[column_names[1:10]],data[column_names[10]],test_size=0.25,random_state=33)
print(y_train.value_counts())
print(y_test.value_counts())

这段的重点在train_test_split()方法,关于这个方法的介绍这位博主写的非常全面:
https://blog.csdn.net/fxlou/article/details/79189106

若在执行时出现了这样的错误

ImportError: DLL load failed: 找不到指定的模块

多半是由于某个模块的版本和sklearn的版本不兼容导致的,比较常见的不兼容模块有scipy、matplotlib等等,解决方法是卸载目前的模块找到兼容的组合进行安装,这位博主经过实验找到了一个兼容组合:
https://blog.csdn.net/howard789/article/details/107542200

正确运行后的结果为:
在这里插入图片描述
上面是训练集每类数量,下面是测试集每类数量。

标准化数据

标准化数据使得每个维度的特征数据方差为1,均值为0,这样预测结果就不会被某些维度过大的特征值主导。具体实现方法是

from sklearn.preprocessing import StandardScaler

ss=StandardScaler()
X_train=ss.fit_transform(X_train)
X_test=ss.fit_transform(X_test)

求解模型参数并预测

分别使用logistic回归和随机梯度上升两种方法求解模型参数并预测,fit()用来训练参数,predict()用来预测。

from sklearn.linear_model import LogisticRegression
from sklearn.linear_model import SGDClassifier

lr=LogisticRegression()
sgdc=SGDClassifier()
lr.fit(X_train,y_train)
lr_y_predict=lr.predict(X_test)
# print(lr_y_predict)
sgdc.fit(X_train,y_train)
sgdc_y_predict=sgdc.predict(X_test)
# print(lr_y_predict)

性能评估

性能评估的指标选择可以参考下图:
在这里插入图片描述
我们用logistic回归模型自带的评分函数来对两个模型的准确性进行评分,并利用classification_report模块获得另外三个指标的结果。

from sklearn.metrics import classification_report

print('Accuracy of LR Classifier:',lr.score(X_test,y_test))
print(classification_report(y_test,lr_y_predict,target_names=['Benign','Malignant']))

print('Accuarcy of SGD Classifier:',sgdc.score(X_test,y_test))
print(classification_report(y_test,sgdc_y_predict,target_names=['Benign','Malignant']))

结果为:
在这里插入图片描述
通过比较,Logistic模型比随机梯度下降模型在测试集上表现有更高的准确性,这是因为Logistic采用解析的方式精确计算模型参数,而随机梯度下降采用估计值计算模型参数。

完整代码

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 SGDClassifier
from sklearn.metrics import classification_report

### 导入数据,删除有缺失值的数据
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']
data=pd.read_csv('breast-cancer-wisconsin.data',names=column_names)
data=data.replace(to_replace='?',value=np.nan)
data=data.dropna(how='any')
# print(data.shape)

### 分割数据集为训练集和测试集
X_train,X_test,y_train,y_test=train_test_split(data[column_names[1:10]],data[column_names[10]],test_size=0.25,random_state=33)
# print(y_train.value_counts())
# # print(y_test.value_counts())

### 标准化数据
ss=StandardScaler()
X_train=ss.fit_transform(X_train)
X_test=ss.fit_transform(X_test)

### 用两种方法训练参数并进行预测
lr=LogisticRegression()
sgdc=SGDClassifier()
lr.fit(X_train,y_train)
lr_y_predict=lr.predict(X_test)
# print(lr_y_predict)
sgdc.fit(X_train,y_train)
sgdc_y_predict=sgdc.predict(X_test)
# print(lr_y_predict)

### 两种方法的性能评估
print('Accuracy of LR Classifier:',lr.score(X_test,y_test))
print(classification_report(y_test,lr_y_predict,target_names=['Benign','Malignant']))

print('Accuarcy of SGD Classifier:',sgdc.score(X_test,y_test))
print(classification_report(y_test,sgdc_y_predict,target_names=['Benign','Malignant']))
  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值