本案例为:使用逻辑回归对良恶性肿瘤二分类
温馨提示:代码左右滑动可查看完整
# 导入pandas与numpy工具包。
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']
# 使用pandas.read_csv函数从互联网读取指定数据。
data = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data', names = column_names )
data.head()
特征解释:
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 类别 2为良性,4为恶性
每个维度特征都是1~10之间的数字
# 将?替换为标准缺失值表示。
data = data.replace(to_replace='?', value=np.nan)
# 丢弃带有缺失值的数据(只要有一个维度有缺失)。
data = data.dropna(how='any')
# 输出data的数据量和维度。
data.shape
data[column_names[1:10]].head()
#683条数据 9个特征 1个id 1个分类结果
# 使用sklearn.cross_valiation里的train_test_split模块用于分割数据。
from sklearn.cross_validation import train_test_split
# 随机采样25%的数据用于测试,剩下的75%用于构建训练集合。
X_train, X_test, y_train, y_test = train_test_split(data[column_names[1:10]], #特征:第0列id去掉,第10列分类结果去掉
data[column_names[10]],#第10列的分类结果作为目标分类变量
test_size=0.25,
random_state=33)
# 查验训练样本的数量和类别分布。
# 即训练集中良性和恶性数量
y_train.value_counts()
# 查验测试样本的数量和类别分布。
# 即测试集中良性和恶性数量
y_test.value_counts()
# 从sklearn.preprocessing里导入StandardScaler。
from sklearn.preprocessing import StandardScaler
# 从sklearn.linear_model里导入LogisticRegression
from sklearn.linear_model import LogisticRegression
# 标准化数据,保证每个维度的特征数据方差为1,均值为0。使得预测结果不会被某些维度过大的特征值而主导。
ss = StandardScaler()
X_train = ss.fit_transform(X_train)
X_test = ss.transform(X_test)
# 初始化LogisticRegression
#逻辑回归
lr = LogisticRegression()
# 调用LogisticRegression中的fit函数/模块用来训练模型参数。
lr.fit(X_train, y_train)
# 使用训练好的模型lr对X_test进行预测,结果储存在变量lr_y_predict中。
lr_y_predict = lr.predict(X_test)
# 从sklearn.metrics里导入classification_report模块。 分类报告
from sklearn.metrics import classification_report
# 使用逻辑斯蒂回归模型自带的评分函数score获得模型在测试集上的准确性结果。准确性:预测和真实值比较,预测正确的百分比,Accuracy。
print('Accuracy of LR Classifier:', lr.score(X_test, y_test))
在实际问题中,我们往往更加关注模型对某一特定类别的预测能力。这时,准确性指标就变得笼统了。
比如,在良/恶肿瘤预测中,医生和患者往往更加关注有多少恶性肿瘤被正确地诊断出来,因为这种肿瘤更加致命。
也就是说,在二分类任务下,预测结果和正确标记之间存在4种不同的组合,构成混淆矩阵:
如果恶性肿瘤为阳性,良性肿瘤为阴性
预测正确的恶性肿瘤为 真阳性
预测正确的良性肿瘤为 真阴性
原本是良性肿瘤,预测误判成恶性肿瘤为 假阳性
实际是恶性肿瘤,预测模型没有检测出来,为假阴性
事实上,医生和患者最不愿意看到的是有假阴性的结果
因为这种误诊回耽误治疗时间,进而危及生命!
召回率(Recall)
精确率(Precision)
我们显然更关注召回率,也就是应该被正确识别的恶性肿瘤的百分比
# 利用classification_report模块获得LogisticRegression其他三个指标的结果。
print(classification_report(y_test, lr_y_predict, target_names=['Benign', 'Malignant']))
#support为样本个数
你学会了么?
【人工智能社群】已经成立,旨在打造真正有价值,能交流,一起学习成长的社群,并且每月送书不断!现备注城市+昵称+研究方向,扫码添加好友后立即进群。
▲长按扫码