监督学习经典案例——良/恶性肿瘤预测
1、数据导入及预处理
良恶性肿瘤的数据
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('https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin//breast-cancer-wisconsin.data',names=column_names)
从网上可以直接获取相关数据,使用pandas读取并设置字段名称
data.info()
查看数据信息:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 699 entries, 0 to 698
Data columns (total 11 columns):
Sample code number 699 non-null int64
Clump Thickness 699 non-null int64
Uniformity of Cell Size 699 non-null int64
Uniformity of Cell Shape 699 non-null int64
Marginal Adhesion 699 non-null int64
Single Epithelial Cell Size 699 non-null int64
Bare Nuclei 699 non-null object
Bland Chromatin 699 non-null int64
Normal Nucleoli 699 non-null int64
Mitoses 699 non-null int64
Class 699 non-null int64
dtypes: int64(10), object(1)
memory usage: 60.1+ KB
除了字段 Bare Nuclei 外,其他字段均为数值型数据。
看看这个字段数据是什么情况,
data['Bare Nuclei'].unique()#数据中有问号
array(['1', '10', '2', '4', '3', '9', '7', '?', '5', '8', '6'],
dtype=object)
因为该案例部分数据未收集到,以?代替,在做分析的时候这部分就不能要,把这部分数据删除。
data = data.replace(to_replace='?',value=np.nan) #非法字符的替代
#删除有空值的数据,删除了15行数据
data=data.dropna(how='any')
data.describe()#数据均为1-10的数值,第一列为id
#查看数据整体情况
#现在剩余的数据
data.shape
(683, 11)
2、拆分训练集与测试集
#from sklearn.cross_valiation import train_test_split #数据导入模块从书中的cross_valiation从0.18以后替换为model_selection
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test=train_test_split(data[data.columns[1:10]],data[data.columns[10]],test_size=0.25,random_state=33)
#random_state随机种子,以保证每次随机取出的数据一致
print(y_train.value_counts(),'\n',y_test.value_counts())
#查看数据切分结果
2 344
4 168
Name: Class, dtype: int64
2 100
4 71
Name: Class, dtype: int64
3、使用线性分类器进行训练与预测
from sklearn.preprocessing import StandardScaler #导入归一化模型
from sklearn.linear_model import LogisticRegression
from sklearn.linear_model import SGDClassifier
from sklearn.metrics import classification_report
## 将数值型数据进行归一化处理,减少部分字段的干扰
ss=StandardScaler()
x_train=ss.fit_transform(x_train)
x_test=ss.transform(x_test)
lr=LogisticRegression()
sgdc=SGDClassifier()
lr.fit(x_train,y_train)
lr_predict=lr.predict(x_test)
sgdc.fit(x_train,y_train)
sgdc_predict=sgdc.predict(x_test)
print('lr:',lr.score(x_test,y_test),'sgdc:',sgdc.score(x_test,y_test))
#多次运行以后发现,sgdc分类器结果有很大波动,每次都不一样
lr_report=classification_report(y_test,lr_predict)
print('lr_report:',lr_report)
sgdc_report=classification_report(y_test,sgdc_predict)
print('lr_report:',sgdc_report)
#逻辑斯蒂模型准确率更高
相比于随机梯度下降法,逻辑斯蒂模型准确率更高
4、项目完整代码
import pandas as pd
import numpy as np
#from sklearn.cross_valiation import train_test_split #数据导入模块从书中的cross_valiation从0.18以后替换为model_selection
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
#1、读取清洗数据
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('https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin//breast-cancer-wisconsin.data',names=column_names)
data = data.replace(to_replace='?',value=np.nan)
data=data.dropna(how='any')
#2、切分数据集
x_train,x_test,y_train,y_test=train_test_split(data[data.columns[1:10]],data[data.columns[10]],test_size=0.25,random_state=33)
#random_state随机种子,以保证每次随机取出的数据一致
#3、数据归一化
ss=StandardScaler()
x_train=ss.fit_transform(x_train)
x_test=ss.transform(x_test)
#4、训练数据
lr=LogisticRegression()
sgdc=SGDClassifier()
lr.fit(x_train,y_train)
lr_predict=lr.predict(x_test)
sgdc.fit(x_train,y_train)
sgdc_predict=sgdc.predict(x_test)
#5、比较模型准确性
print('lr:',lr.score(x_test,y_test),'sgdc:',sgdc.score(x_test,y_test))
#多次运行以后发现,sgdc分类器结果有很大波动,每次都不一样
lr_report=classification_report(y_test,lr_predict)
print('lr_report:',lr_report)
sgdc_report=classification_report(y_test,sgdc_predict)
print('lr_report:',sgdc_report)
5、两种分类器比较
大数据量(10万以上)时如果对效率要求比较高就选择随机梯度下降、如果时间长短没关系的话就用逻辑斯蒂
模型 | 优势 | 劣势 |
---|---|---|
逻辑斯蒂 | 精确解析、准确率会高一些 | 计算时间相对较长 |
随机梯度下降 | 计算时间短,在大数据量上能快速运算出结果 | 准确率上没逻辑斯蒂高 |