简介
线性分类器可以说是最为基本和常用的机器学习模型。尽管其受限于数据特征与分类目标的线性假设,我们仍然可以在科学研究与工程实践中把线性分类器的表现作为基准。
本文使用的模型包括LogisticRegression和SGDClassifier。
本文的数据来自UC Irvine Machine Learning Repository的癌症分类数据。
代码实例
废话不多说,上代码!
import numpy as np
import pandas as pd
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 shepe','Marginal Adhesion',
'Single Epithelial cell size', 'Bare Nuclei', 'Bland Chromatin',
'Normal Nucleoli', 'Mitoses', 'Class']
data = pd.read_csv('http://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')
#输出data的数据量和维度
print(data.shape)
#分割数据,选择25%为测试集
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和随机梯度下降函数
lr = LogisticRegression()
sgdc = SGDClassifier()
#用LR拟合并预测数据
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)
#输出LR的准确率和混淆矩阵
print('Accuracy of LR Classifier:', lr.score(X_test, y_test))
print(classification_report(y_test, lr_y_predict, target_names=['Benign', 'Malignant']))
print('-------------------------------------------------------')
#输出随机梯度下降的准确率和混淆矩阵
print('Accravy of SGD Classifier:', sgdc.score(X_test, y_test))
print(classification_report(y_test, sgdc_y_predict, target_names=['Benign', 'Malignant']))
输出结果如下:
小结
从输出结果可以看出
- LR 对于参数的计算采用精确解析的方式,计算时间长但是模型性能略高
- SGDClassifier 采用随机梯度下降算法估计模型参数,计算时间短但是产出模型性能略低。
- 一般而言,对于训练数据规模10万量级以上的数据,考虑到时间的耗用,更推荐使用随机梯度算法对模型参数进行估计。
- SGD的优点是高效和容易实现,而缺点也很明显:SGD需要许多超参数:比如正则项参数、迭代数;同时SGD对于特征归一化(feature scaling)是敏感的。