分类学习
- 二分类:判断是非
- 多分类: 在多于两个类别中选一个
- 多标签分类: 判断一个样本是否同时属于多个不同类别
线性分类器
是一种假设特征与分类结果存在线性关系的模型。这个模型通过累加计算每个维度的特征与各自权重的乘积来帮助类别决策。
# -*- coding: UTF-8 -*-
"""
Create on July 9, 2018
@Li Guojing
"""
#良/恶性乳腺癌肿瘤数据预处理
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']
#使用pandas.read_csv函数读取指定数据。
data = pd.read_csv('data.csv', names=column_names)
#将?替换为标准缺失值表示。
data = data.replace(to_replace='?', value=np.nan)
#丢弃带有缺失值的数据(只要有一个维度有缺失)。
data = data.dropna(how='any')
#输出data的数据量和维度
print(data.shape)
#out[]:(683, 11)
#准备良/恶性乳腺癌肿瘤训练、测试数据
#使用sklearn.model_selection里的train_test_split模块用于分割数据。
from sklearn.model_selection import train_test_split
#随机采样25%的数据用于测试,剩下的75%用于构建训练集合
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)#33-伪随机数产生的种子
#查验训练样本的数量和类别分布
print(y_train.value_counts())
#out[]:2 344
# 4 168
# Name: Class, dtype: int64
#训练样本共有512条(344条良性肿瘤数据,168条恶性肿瘤数据)
#查验测试样本的数量和类别分布
print(y_test.value_counts())
#out[]:2 100
# 4 71
# Name: Class, dtype: int64
#测试样本共有171条(100条良性肿瘤数据,71条恶性肿瘤数据)
#使用线性分类模型从事良/恶性肿瘤预测任务
#使用逻辑斯蒂回归与随机梯度参数估计两种方法对上述处理后的训练数据进行学习,并且根据测试样本特征进行预测。
#从sklearn.preprocessing里导入StandardScaler
from sklearn.preprocessing import StandardScaler
#从sklearn.linear_model里导入LogisticRegression与SGDClassf
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()
#调用LogisticRegression中的fit函数/模块用来训练模型参数
lr.fit(X_train, y_train)
#使用训练好的模型lr对X_test进行预测,结果储存在变量lr_y_predict中。
lr_y_predict = lr.predict(X_test)
#调用SGRClassifier中的fit函数/模块用来训练模型参数。
sgdc.fit(X_train, y_train)
#使用训练好的模型sgdc对X_test进行预测,结果储存在变量sgdc_y_predict中。
sgdc_y_predict = sgdc.predict(X_test)
#使用线性分类模型从事良/恶性肿瘤预测任务的性能分析。
#从sklearn.metrics里导入classification_report模块
from sklearn.metrics import classification_report
#使用逻辑斯蒂回归模型自带的评分函数score获得模型在测试集上的准确性结果
print('Accuracy of LR Classifier:', lr.score(X_test, y_test))
#out[]: Accuracy of LR Classifier: 0.9883040935672515
#利用classification_report模块获得LogisticRegression其他三个指标的结果。
#classification_report简介
#sklearn中的classification_report函数用于显示主要分类指标的文本报告.
# 在报告中显示每个类的精确度,召回率,F1值等信息。
#主要参数:
#y_true:1维数组,或标签指示器数组/稀疏矩阵,目标值。
#y_pred:1维数组,或标签指示器数组/稀疏矩阵,分类器返回的估计值。
#labels:array,shape = [n_labels],报表中包含的标签索引的可选列表。
#target_names:字符串列表,与标签匹配的可选显示名称(相同顺序)。
#sample_weight:类似于shape = [n_samples]的数组,可选项,样本权重。
#digits:int,输出浮点值的位数.
print(classification_report(y_test, lr_y_predict, target_names=['Beginn', 'Malignant']))
# out[]: precision recall f1-score support
#
# Beginn 0.99 0.99 0.99 100
# Malignant 0.99 0.99 0.99 71
#
# avg / total 0.99 0.99 0.99 171
#使用随机梯度下降模型自带的评分函数score获得模型在测试集上的准确性结果
print('Accuracy of SGD Classifier:', sgdc.score(X_test, y_test))
#out[]: Accuracy of SGD Classifier: 0.935672514619883
#利用classification_report模块获得SGDClassifier其他三个指标的结果。
print(classification_report(y_test, sgdc_y_predict, target_names=['Benign', 'Malignant']))
#out[]: precision recall f1-score support
#
# Benign 0.91 0.99 0.95 100
# Malignant 0.98 0.86 0.92 71
#
# avg / total 0.94 0.94 0.93 171
特点分析
- LogisticRegression: 对参数的计算采用精确解析的方式,计算时间长但是模型性能略高。
- SGDClassifier: 采用随机梯度上升算法估计模型参数,计算时间短但是产出的模型性能略低。一般而言,对于训练数据规模在10万量级以上的数据,考虑到时间的耗用,推荐使用随机梯度算法对模型参数进行估计。