逻辑回归—良/恶性乳腺癌肿瘤预测
- 逻辑回归的损失函数、优化
与线性回归原理相同,但由于是分类问题,损失函数不一样,只能通过梯度下降求解
sklearn逻辑回归API
sklearn.linear_model.LogisticRegression
- LogisticRegression
sklearn.linear_model.LogisticRegression(penalty=‘l2’, C = 1.0)
Logistic回归分类器
coef_:回归系数
-
只能解决二分类问题:
广告点击率
判断用户的性别
预测用户是否会购买给定的商品类
判断一条评论是正面的还是负面的
LogisticRegression回归案例-良/恶性乳腺癌肿瘤预测
良/恶性乳腺癌肿数据
原始数据的下载地址:
https://archive.ics.uci.edu/ml/machine-learning-databases/
7.#属性域
------------------------------------------
1.样品编号ID编号
2.团块厚度1-10
3.像元大小的均匀性1-10
4.细胞形状的均匀性1-10
5.边缘附着力1-10
6.单上皮细胞大小1-10
7.裸核1-10
8.淡色染色质1-10
9.正常核仁1-10
10.线粒体1-10
11.等级:(2代表良性,4代表恶性)
8.缺少属性值:16
第1到第6组中的16个实例包含一个缺失项
(即不可用)属性值,现在用“?”表示。
9.班级分布:
良性:458(65.5%)
恶性:241(34.5%)
此处恶性为正例,良性为反例。
哪一个类别少,判定概率值是这个类别!
-
数据描述
(1)699条样本,共11列数据,第一列用语检索的id,后9列分别是与肿瘤
相关的医学特征,最后一列表示肿瘤类型的数值。
(2)包含16个缺失值,用”?”标出。 -
pandas使用
pd.read_csv(’’,names=column_names)
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']
return:数据replace(to_replace=’’,value=):返回数据
dropna():返回数据
- 良/恶性乳腺癌肿分类流程
1、网上获取数据(工具pandas)
2、数据缺失值处理、标准化
3、LogisticRegression估计器流程
from sklearn.linear_model import LinearRegression, SGDRegressor, Ridge, LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error, classification_report
import pandas as pd
import numpy as np
def logistic():"""逻辑回归做二分类进行癌症预测(根据细胞的属性特征):return: NOne"""# 构造列标签名字column = ['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("https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data", names=column)print(data)# 缺失值进行处理data = data.replace(to_replace='?', value=np.nan)#删除data = data.dropna()# 进行数据的分割x_train, x_test, y_train, y_test = train_test_split(data[column[1:10]], data[column[10]], test_size=0.25)#1-10列是特征值,最后一列10代表11列目标值# 进行标准化处理std = StandardScaler()x_train = std.fit_transform(x_train)x_test = std.transform(x_test)# 逻辑回归预测lg = LogisticRegression(C=1.0)lg.fit(x_train, y_train)print(lg.coef_)y_predict = lg.predict(x_test)print("准确率:", lg.score(x_test, y_test))print("召回率:", classification_report(y_test, y_predict, labels=[2, 4], target_names=["良性", "恶性"]))return Noneif __name__ == "__main__":logistic()
[699 rows x 11 columns]
[[1.35467578 0.18001121 0.74721681 0.89447017 0.38691172 1.264152650.95382046 0.53218847 0.51240579]]
准确率: 0.9707602339181286
召回率: precision recall f1-score support良性 0.97 0.98 0.98 112恶性 0.97 0.95 0.96 59accuracy 0.97 171macro avg 0.97 0.97 0.97 171
weighted avg 0.97 0.97 0.97 171