本文为《Python机器学习及实践:从零通往Kaggle竞赛之路》一书学习笔记,欢迎与我交流数据挖掘、机器学习相关话题。
本文与前文利用sklearn进行分类:良/恶性乳腺癌肿瘤预测(一)的区别在于数据集的特征更加丰富,一共有8个特征,类别还是两类:良性/恶性(在此数据集中分别记为2和4)。
1.数据预处理
该数据集有部分缺失数据被记为''?'',训练之前先去除含缺失值的样本
# 创建特征列表
data.replace(to_replace='?',value=np.nan,inplace=True) #将?替换为标准缺失值
data.dropna(how='any',inplace=True) #只要有一个维度数据有缺失则丢弃数据
使用sklearn自带的预处理库将数据集按3:1划分训练集和测试集
from sklearn.cross_validation import train_test_split #按3:1划分训练集与测试集
X_train,X_test,y_train,y_test = train_test_split(data[column_names[1:10]],data[column_names[10]],test_size=0.25)
#第1列为编号 2-9列为特征 第10列为类别(一共2类:2,4)
由于不同特征之间数值差距较大,为保证预测结果不会被某些维度过大的特征而主导,先标准化数据集
from sklearn.preprocessing import StandardScaler #将数据标准化为正态分布
#标准化特征
ss = StandardScaler()
X_train = ss.fit_transform(X_train)
X_test = ss.fit_transform(X_test)
2.训练模型
我们假设数据特征和分类目标之间存在线性关系,这里使用2种线性分类器LogisticRegression与SGDClassifier分别训练并作比较。
LogisiticRegression:采用常规精确计算的方式计算参数,计算时间长模型性能略高
SGDclassifier: 采用梯度法迭代渐进估计参数,计算时间短模型性能略低
#创建模型并训练、预测
lr = LogisticRegression()
sgd = SGDClassifier()
lr.fit(X_train,y_train)
lr_y_predict = lr.predict(X_test) #lr分类结果
sgd.fit(X_train,y_train)
sgd_y_predict = lr.predict(X_test) #sgd分类结果
3.评价训练结果
可以看到,LogisiticRegression效果略好,但大数据集下为了追求训练速度,一般采用梯度法进行线性分类。
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)
print 'Accuracy of SGD Classifier:',sgd.score(X_test,y_test)
print classification_report(y_test,sgd_y_predict)
评价指标有score(即Accuracy)正确率、Precision精确率、Recall召回率、F1指数
以下记正样本为positive ,负样本为negative
由计算公式可知,Accuracy即分类正确的个数与样本总数的比值,Precision为正样本个正确分类的个数与正样本总数的比值,Recall为分类正确的负样本个数与分类正确的正样本个数+分类错误的负样本个数的比值,而F1则衡量了Precision与Recall的距离,越接近,F1值越高。
对于肿瘤分类的实际问题,显然False negative的结果最不能接收,即负样本(恶性)没有被正确识别。
附一张更清晰的图