基于逻辑回归构建肿瘤预测模型
使用逻辑回归构建肿瘤预测模型
描述
乳腺癌数据集包括569个样本,每个样本有30个特征值(病灶特征数据),每个样本都属于恶性(0)或良性(1)两个类别之一,要求使用逻辑回归(LR)算法建立预测模型,实现准确预测新的病灶数据的类型(恶性或良性)。
样本特征数据为病灶影像的测量数据,部分特征如下:
本任务的主要实践内容:
1、 逻辑回归-肿瘤预测模型的构建、预测及评估
2、 逻辑回归-鸢尾花(Iris)分类模型的实现
源码下载
环境
-
操作系统:Windows 10、Ubuntu18.04
-
工具软件:Anaconda3 2019、Python3.7
-
硬件环境:无特殊要求
-
依赖库列表
matplotlib 3.3.4 numpy 1.19.5 pandas 1.1.5 scikit-learn 0.24.2 mglearn 0.1.9
分析
逻辑回归(LogisticRegression)虽然名字中带有“回归”,却是一个经典的分类算法, 本任务通过完成乳腺癌肿瘤预测(通过病灶特征数据预测肿瘤为恶性还是良性,属于监督学习中二分类问题),熟练掌握逻辑回归的原理及编程应用。
本任务涉及以下几个环节:
a)加载、查看乳腺癌数据集
b)数据集拆分
d)构建模型、评估并优化模型、
e)在测试集上预测结果,并输出预测概率
f)利用逻辑回归实现鸢尾花分类(多分类)
实施
1、加载、查看乳腺癌数据集
from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer() # 加载cancer数据集
print(cancer.keys()) # 查看数据有哪些keys(与鸢尾花数据集相同)
输出结果:
dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names', 'filename'])
print('Shape of data:', cancer.data.shape) # 数据集尺寸
输出结果:
Shape of data: (569, 30)
print(cancer.target_names) # 标签名称(malingant-恶性,begin-良性)
print(cancer.target) # 标签数据(569个0或1, 0-恶性,1-良性)
输出结果:
['malignant' 'benign']
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 0 0 1 0 0 1 1 1 1 0 1 0 0 1 1 1 1 0 1 0 0
1 0 1 0 0 1 1 1 0 0 1 0 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 1 1 0 1 1 0 1 1
1 1 1 1 1 1 0 0 0 1 0 0 1 1 1 0 0 1 0 1 0 0 1 0 0 1 1 0 1 1 0 1 1 1 1 0 1
1 1 1 1 1 1 1 1 0 1 1 1 1 0 0 1 0 1 1 0 0 1 1 0 0 1 1 1 1 0 1 1 0 0 0 1 0
1 0 1 1 1 0 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 1 1 0 1 0 0 0 0 1 1 0 0 1 1
1 0 1 1 1 1 1 0 0 1 1 0 1 1 0 0 1 0 1 1 1 1 0 1 1 1 1 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 1 1 1 1 1 0 1 0 1 1 0 1 1 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1
1 0 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 1 1 1 0 0 0 1 1
1 1 0 1 0 1 0 1 1 1 0 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 0
0 1 0 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 0 1 1 0 0 1 1 1 1 1 1 0 1 1 1 1 1 1
1 0 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 1 0 1 1 1 1 1 0 1 1
0 1 0 1 1 0 1 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1
1 1 1 1 1 1 0 1 0 1 1 0 1 1 1 1 1 0 0 1 0 1 0 1 1 1 1 1 0 1 1 0 1 0 1 0 0
1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 0 0 0 0 0 0 1]
2、拆分数据集
from sklearn.model_selection import train_test_split
# 随机拆分数据集
# X_train 训练集
# X_test 测试集
# y_train 训练集标签(即训练集数据对应的类别)
# y_test 测试集标签(即测试集数据对应的类别)
# test_size 测试集比例
# random_state 随机状态(设置为固定值可以锁定拆分结果,用于数据复现)
X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target,
test_size=0.25, random_state=0)
# 查看拆分情况
print(X_train.shape, X_test.shape)
print(y_train.shape, y_test.shape)
输出结果:
(426, 30) (143, 30)
(426,) (143,)
3、构建模型、评估
from sklearn.linear_model import LogisticRegression
# 采用默认参数创建LR模型,并拟合训练数据
model = LogisticRegression().fit(X_train, y_train)
# 评估模型在训练集和测试集上的成绩
score_train = model.score(X_train, y_train)
score_test = model.score(X_test, y_test)
print(score_train, score_test)
输出结果:
0.9553990610328639 0.958041958041958
4、在测试集上预测结果,并输出预测概率
这里我们预测测试集中的前三个样本,输出预测结果(0-恶性,1-良性),并输出0和1对应的概率值。
# 预测结果(0-恶性,1-良性)
y_pred = model.predict(X_test[:3]) # 预测测试集前三个样本
print(y_pred)
# 输出预测的概率值(0和1的概率值)
y_pred_proba = model.predict_proba(X_test[:3]) # 预测测试集前三个样本
print(y_pred_proba)
输出结果:
[0 1 1]
[[0.99284545 0.00715455]
[0.0332907 0.9667093 ]
[0.00271258 0.99728742]] # 该样本属于0的概率为0.002,属于1的概率为0.997,所以判断为类别1
强调:逻辑回归算法计算样本属于每个类别的概率值(即可能性),取概率值最大的类别作为预测结果。
5、扩展练习——基于逻辑回归实现鸢尾花分类(多分类问题)
from sklearn.datasets import load_iris
# 加载Iris数据集
iris = load_iris()
# 数据集拆分
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target,
test_size=0.25, random_state=0)
# 创建LR模型
# model = LogisticRegression().fit(X_train, y_train) # 0.9821428571428571 0.9736842105263158
# 优化模型参数,提升模型性能(C正则化系数,penalty正则化类型l1 or l2)
model = LogisticRegression(C=10, penalty='l2').fit(X_train, y_train) # 0.9910714285714286 0.9736842105263158
# 评估模型成绩
score_train = model.score(X_train, y_train)
score_test = model.score(X_test, y_test)
print(score_train, score_test)
# 预测鸢尾花种类并与实际种类做对比(前十个样本)
y_pred = model.predict(X_test)
print('预测类别:' ,y_pred[:10])
print('实际类别:' ,y_test[:10])
输出结果:
0.9821428571428571 0.9736842105263158
预测类别: [2 1 0 2 0 2 0 1 1 1]
实际类别: [2 1 0 2 0 2 0 1 1 1]
优化参数,提升模型性能:
model = LogisticRegression(C=10, penalty='l2').fit(X_train, y_train) # 0.9910714285714286 0.9736842105263158
优化后结果为:
0.9910714285714286 0.9736842105263158
预测类别: [2 1 0 2 0 2 0 1 1 1]
实际类别: [2 1 0 2 0 2 0 1 1 1]