线性分类模型训练以“良/恶性乳腺癌肿瘤”为例。
我们知道原始数据为699条,每条样本是11列不同数值。其中1列用于检索的id,9列与肿瘤相关的医学特征,最后一列为表征肿瘤类型的数值。
准备数据
导入原始数据
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 )
将?的值替换为np.nan,并将缺失值丢弃
data = data.replace(to_replace='?', value=np.nan)
data = data.dropna(how='any')
对标记数据进行分割,其中75%用于训练,25%用于测试
from sklearn.cross_validation 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)
检查训练样本的数量和类别分布
y_train.value_counts()
2 344
4 168
Name: Class, dtype: int64
检查测试样本的数量和类别分布
y_test.value_counts()
2 100
4 71
Name: Class, dtype: int64
训练
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.linear_model import SGDClassifier
标准化数据,保证每个维度的特征数据方差为1,均值为0.从而使得预测结果不会被某些维度过大的特征值主导。
ss = StandardScaler()
X_train = ss.fit_transform(X_train)
X_test = ss.transform(X_test)
分别用LogisticRegression和SGDClassifier训练模型,并预测
lr = LogisticRegression()
sgdc = SGDClassifier()
lr.fit(X_train, y_train)
lr_y_predict = lr.predict(X_test)
sgdc.fit(X_train, y_train)
sgdc_y_predict = sgdc.predict(X_test)
在预测结果中,对于肿瘤问题,其实我们更关注的是预测出错的问题,比如误判为恶性肿瘤的假阳性和没有检测出来的假阴性。
对预测任务的性能进行分析
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'])