本文参考书《Python机器学习及实践》(范淼 李超 编著)
理论分析
线性分类器
Logistic回归
随机梯度上升
略
数据分析
代码分析
导入数据
数据包文件名为breast-cancer-wisconsin.data,观察数据发现共十一列,699行,十一列中第1列为序号,2-10列是肿瘤参数,第11列是分类标签,因此先建立一个名称数组,用pandas的read_csv()方法读入数据,随后观察数据进行缺失值的处理。
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('breast-cancer-wisconsin.data',names=column_names)
data=data.replace(to_replace='?',value=np.nan)
data=data.dropna(how='any')
print(data.shape)
输出的结果是处理后数据的行数和列数。
分割数据集
分割数据集用的是sklearn中的train_test_split模块,我们将数据中的75%用于训练,25%用于测试,代码为:
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test=train_test_split(data[column_names[1:10]],data[column_names[10]],test_size=0.25,random_state=33)
print(y_train.value_counts())
print(y_test.value_counts())
这段的重点在train_test_split()方法,关于这个方法的介绍这位博主写的非常全面:
https://blog.csdn.net/fxlou/article/details/79189106
若在执行时出现了这样的错误
ImportError: DLL load failed: 找不到指定的模块
多半是由于某个模块的版本和sklearn的版本不兼容导致的,比较常见的不兼容模块有scipy、matplotlib等等,解决方法是卸载目前的模块找到兼容的组合进行安装,这位博主经过实验找到了一个兼容组合:
https://blog.csdn.net/howard789/article/details/107542200
正确运行后的结果为:
上面是训练集每类数量,下面是测试集每类数量。
标准化数据
标准化数据使得每个维度的特征数据方差为1,均值为0,这样预测结果就不会被某些维度过大的特征值主导。具体实现方法是
from sklearn.preprocessing import StandardScaler
ss=StandardScaler()
X_train=ss.fit_transform(X_train)
X_test=ss.fit_transform(X_test)
求解模型参数并预测
分别使用logistic回归和随机梯度上升两种方法求解模型参数并预测,fit()用来训练参数,predict()用来预测。
from sklearn.linear_model import LogisticRegression
from sklearn.linear_model import SGDClassifier
lr=LogisticRegression()
sgdc=SGDClassifier()
lr.fit(X_train,y_train)
lr_y_predict=lr.predict(X_test)
# print(lr_y_predict)
sgdc.fit(X_train,y_train)
sgdc_y_predict=sgdc.predict(X_test)
# print(lr_y_predict)
性能评估
性能评估的指标选择可以参考下图:
我们用logistic回归模型自带的评分函数来对两个模型的准确性进行评分,并利用classification_report模块获得另外三个指标的结果。
from sklearn.metrics import classification_report
print('Accuracy of LR Classifier:',lr.score(X_test,y_test))
print(classification_report(y_test,lr_y_predict,target_names=['Benign','Malignant']))
print('Accuarcy of SGD Classifier:',sgdc.score(X_test,y_test))
print(classification_report(y_test,sgdc_y_predict,target_names=['Benign','Malignant']))
结果为:
通过比较,Logistic模型比随机梯度下降模型在测试集上表现有更高的准确性,这是因为Logistic采用解析的方式精确计算模型参数,而随机梯度下降采用估计值计算模型参数。
完整代码
import pandas as pd
import numpy as np
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
### 导入数据,删除有缺失值的数据
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('breast-cancer-wisconsin.data',names=column_names)
data=data.replace(to_replace='?',value=np.nan)
data=data.dropna(how='any')
# print(data.shape)
### 分割数据集为训练集和测试集
X_train,X_test,y_train,y_test=train_test_split(data[column_names[1:10]],data[column_names[10]],test_size=0.25,random_state=33)
# print(y_train.value_counts())
# # print(y_test.value_counts())
### 标准化数据
ss=StandardScaler()
X_train=ss.fit_transform(X_train)
X_test=ss.fit_transform(X_test)
### 用两种方法训练参数并进行预测
lr=LogisticRegression()
sgdc=SGDClassifier()
lr.fit(X_train,y_train)
lr_y_predict=lr.predict(X_test)
# print(lr_y_predict)
sgdc.fit(X_train,y_train)
sgdc_y_predict=sgdc.predict(X_test)
# print(lr_y_predict)
### 两种方法的性能评估
print('Accuracy of LR Classifier:',lr.score(X_test,y_test))
print(classification_report(y_test,lr_y_predict,target_names=['Benign','Malignant']))
print('Accuarcy of SGD Classifier:',sgdc.score(X_test,y_test))
print(classification_report(y_test,sgdc_y_predict,target_names=['Benign','Malignant']))