杜凯杰教学数据分析:Logistic(逻辑回归)算法完整实例数据集建模处理,缺省值处理、类型转换、建模预测

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_44528048/article/details/100051616

基于病理数据集使用Logistic算法构建模型进行乳腺癌预测(良性2/恶性4)—杜凯杰

杜凯杰教学数据分析
数据来源:http://archive.ics.uci.edu/ml/datasets/Breast+Cancer+Wisconsin+%28Original%29
实验采用 UCI 数据集中的 Wisconsin 医学院的 William H.Wolberg 博士提供的乳腺 癌 的 数
据 样 本 。所有数据来自真实临床案例,每个案例有 10 个属性。其中前九个属性是检 测指标(X值),每个属性值用 1 到 10 的整数表示, 1 表示检测指标最正常, 10 表示最不正常。 第十个属性是分类属性(Y值), 指示该肿瘤是否为恶性。

Attribute Information:

  1. Sample code number: id number
  2. Clump Thickness: 1 - 10
  3. Uniformity of Cell Size: 1 - 10
  4. Uniformity of Cell Shape: 1 - 10
  5. Marginal Adhesion: 1 - 10
  6. Single Epithelial Cell Size: 1 - 10
  7. Bare Nuclei: 1 - 10
  8. Bland Chromatin: 1 - 10
  9. Normal Nucleoli: 1 - 10
  10. Mitoses: 1 - 10
  11. Class: (2 for benign, 4 for malignant)

如果懂医疗数据的可以很方便理解这些属性代表的意义,像我这样的外行,只能通过数据来说话了………数据集数据量较少,只有569条病患的记录,我们今天就根据这些数据来建模。

加载包

import numpy as np import pandas as pd

加载数据,并添加属性标签

df=pd.read_csv('breast-cancer-wisconsin.data')
df.columns=['Id 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']

查看数据集效果及数据类型

df.head(5)

杜凯杰教学数据分析

判断数据是否有空(缺省)值

df.isnull().sum().sort_values(ascending=False)

如果有空值,我们需要把空值实例删除,或者用其它值替换,一般使用平均值,缺省值的处理需视实际场景而定,不可随意处理!

显示没有空值,但’Bare Nuclei’字段有异常值"?"需要处理,先将异常值替换为空值,然后删除所在的实例

df=df.replace('?',np.nan).dropna()

因为异常值的存在,数据列属性为object,需要更改为数值型np.int64

df['Bare Nuclei']=df['Bare Nuclei'].astype(np.int64)

查看数据属性的数值类型

df.info()

我们先将类别转换为0和1

df.Class=(df.Class/2-1).astype(np.int64)

我们这次做的是分类任务,查看下实例的类别数量,判断是否需要平衡采样,

df.Class.value_counts()

杜凯杰教学数据分析

将类别数量少的样本重采样,采样份数为类别差距的数量,

dc=df[df['Class']==1].sample(n=df.Class.value_counts()[0]-df.Class.value_counts()[1])

将采样数据添加至数据集中,完成数据类别平衡采样,实际操作过程中,如果样本类别数量差距不是太大,可不用采样,一切以实现应用场景为准

df=pd.concat([df,dc])

查看采样后的样本类别数据,看下是否采样成功

df.Class.value_counts()

杜凯杰教学数据分析

删除无用属性’Id number’ 实际应用场景中可按经验删除无用属性,从而提高模型精度

df=df.drop(‘Id number’,axis=1)

提取X,Y值

X=df.iloc[:,:-1]
Y=df.iloc[:,[-1]]

数据标准化(归一化)将数据限定在同一级别

from sklearn.preprocessing import StandardScaler
coder=StandardScaler()
X=pd.DataFrame(coder.fit_transform(X))

分割数据集,将数据分为测试集和训练集,一般3/7分或者2/8分

from sklearn.model_selection import train_test_split
X_train,X_test,Y_train,Y_test=train_test_split(X,Y,test_size=0.3,random_state=0)

用LR模型训练(逻辑回归模型)

from sklearn.linear_model import LogisticRegression
model=LogisticRegression()

训练数据集

model.fit(X_train,Y_train)

查看测试集预测精度0-1

model.score(X_test,Y_test)

杜凯杰教学数据分析

到这里模型已经基本建完,剩下的就是模型布署了,这里就不讲了,末尾附上全部源码,以供练习参考,如果你有更好的思路可以联系我共同探讨 ^ _ ^ 查看详情

# 加载包
import numpy as np
import pandas as pd

# 加载数据,并添加属性标签
df=pd.read_csv('breast-cancer-wisconsin.data')
df.columns=['Id 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']

# 判断数据是否有空(缺省)值
df.isnull().sum().sort_values(ascending=False)

# 如果有空值,我们需要把空值实例删除,或者用其它值替换,一般使用平均值,缺省值的处理需视实际场景而定,不可随意处理!
# 显示没有空值,但'Bare Nuclei'字段有异常值"?"需要处理,先将异常值替换为空值,然后删除所在的实例
df=df.replace('?',np.nan).dropna()

# 因为异常值的存在,数据列属性为object,需要更改为数值型np.int64
df['Bare Nuclei']=df['Bare Nuclei'].astype(np.int64)

# 查看数据属性的数值类型
df.info()

# 我们先将类别转换为0和1
df.Class=(df.Class/2-1).astype(np.int64)

# 我们这次做的是分类任务,查看下实例的类别数量,判断是否需要平衡采样,
df.Class.value_counts()

# 将类别数量少的样本重采样,采样份数为类别差距的数量,
dc=df[df['Class']==1].sample(n=df.Class.value_counts()[0]-df.Class.value_counts()[1])

# 将采样数据添加至数据集中,完成数据类别平衡采样,实际操作过程中,如果样本类别数量差距不是太大,可不用采样,一切以实现应用场景为准
df=pd.concat([df,dc])

# 查看采样后的样本类别数据,看下是否采样成功
df.Class.value_counts()

# 删除无用属性'Id number' 实际应用场景中可按经验删除无用属性,从而提高模型精度
# df=df.drop('Id number',axis=1)
# 提取X,Y值
X=df.iloc[:,:-1]
Y=df.iloc[:,[-1]]

# 数据标准化(归一化)将数据限定在同一级别
from sklearn.preprocessing import StandardScaler
coder=StandardScaler()
X=pd.DataFrame(coder.fit_transform(X))

# 分割数据集,将数据分为测试集和训练集,一般3/7分或者2/8分
from sklearn.model_selection import train_test_split
X_train,X_test,Y_train,Y_test=train_test_split(X,Y,test_size=0.3,random_state=0)

# 用LR模型训练(逻辑回归模型)
from sklearn.linear_model import LogisticRegression
model=LogisticRegression()
# 训练数据集
model.fit(X_train,Y_train)
# 查看测试集预测精度0-1
model.score(X_test,Y_test)

猜你喜欢

转载自blog.csdn.net/weixin_44528048/article/details/100051616