逻辑回归算法思想:逻辑回归(LogisticRegression)是当前机器学习算法比较常用的方法,可以用来回归分析,也可以用来分类,主要是二分类问题。逻辑回归分类算法就是将线性回归应用在分类场景中,通过曲线拟合与sigmoid函数得到对样本数据的分类标签,在二分类问题中得到的分类结果为0/1。
该原始数据共有699个样本,每个样本有11列不同的数值:第一列是检索的ID,中间9列是与肿瘤相关的医学特征,以及一列表征肿瘤类型的数值。所有9列用于表示肿瘤医学特质的数值均被量化为1-10之间的数字,而肿瘤的类型也用数字2和数字4分别指代良性与恶性。不过这份数据也表明其中包含16个缺失值,并且用‘?’指代。
%reset -f
%clear
# In[*]
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)
data = data.replace(to_replace='?',value=np.nan) #非法字符的替代
data = data.dropna(how='any') #去掉空值,any:出现空值行则删除
print(data.shape)
(683, 11)
处理步骤:
- 创建特征列表表头
- 使用pandas.read_csv函数从网上读取数据集
- 将?替换为标准缺失值表示
- 丢弃带有缺失值的数据(只要有一个维度有缺失便丢弃)
- 查看data的数据量和维度
# In[*]
#使用sklearn.cross_validation里的train_test_split模块分割数据集
from sklearn.cross_validation 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 = 1234)
#查看训练样本的数量和类别分布
y_train.value_counts()
Out[16]:
2 333
4 179
Name: Class, dtype: int64
综上,我们用于训练的样本共有512条(其中有333例良性肿瘤数据,179调恶性中流数据)
# In[*]
#从sklearn.preprocessing导入StandardScaler
from sklearn.preprocessing import StandardScaler
#从sklearn.linear_model导入LogisticRegression(逻辑斯蒂回归)
from sklearn.linear_model import LogisticRegression
#从sklearn.linear_model导入SGDClassifier(随机梯度参数)
from sklearn.linear_model import SGDClassifier
#标准化数据,保证每个维度的特征数据方差为1,均值为,使得预测结果不会被某些过大的特征值而主导(在机器学习训练之前, 先对数据预先处理一下, 取值跨度大的特征数据, <br>我们浓缩一下, 跨度小的括展一下, 使得他们的跨度尽量统一.)
ss = StandardScaler()
X_train = ss.fit_transform(X_train)
X_test = ss.transform(X_test)
#初始化两种模型
lr = LogisticRegression()
sgdc = SGDClassifier()
#调用逻辑斯蒂回归,使用fit函数训练模型参数
lr.fit(X_train,y_train)
#使用训练好的模型lr对x_test进行预测,结果储存在变量lr_y_predict中
lr_y_predict = lr.predict(X_test)
#调用随机梯度的fit函数训练模型
sgdc.fit(X_train,y_train)
#使用训练好的模型sgdc对X_test进行预测,结果储存在变量sgdc_y_predict中
sgdc_y_predict = sgdc.predict(X_test)
# In[*]
#从sklearn.metrics导入classification_report
from sklearn.metrics import classification_report
#使用逻辑斯蒂回归模型自带的评分函数score获得模型在测试集上的准确性结果
print('Accuracy of LR Classifier:',lr.score(X_test,y_test))
#使用classification_report模块获得逻辑斯蒂模型其他三个指标的结果(召回率,精确率,调和平均数)
print(classification_report(y_test,lr_y_predict,target_names=['Benign','Malignant']))
Accuracy of LR Classifier: 0.3508771929824561
precision recall f1-score support
Benign 0.98 0.96 0.97 111
Malignant 0.94 0.97 0.95 60
avg / total 0.97 0.96 0.97 171
# In[*]
#使用随机梯度下降模型自带的评分函数score获得模型在测试集上的准确性结果
print('Accuarcy of SGD Classifier:',sgdc.score(X_test,y_test))
##使用classification_report模块获得随机梯度下降模型其他三个指标的结果
print(classification_report(y_test,sgdc_y_predict,target_names=['Benign','Malignant']))
Accuarcy of SGD Classifier: 0.3508771929824561
precision recall f1-score support
Benign 0.99 0.96 0.98 111
Malignant 0.94 0.98 0.96 60
avg / total 0.97 0.97 0.97 171
结论:通过比较,逻辑斯蒂模型比随机梯度下降模型在测试集上表现有更高的准确性,因为逻辑斯蒂采用解析的方式精确计算模型参数,而随机梯度下降采用估计值
特点分析:线性分裂期可以说是最为基本和常用的机器学习模型。尽管其首先与数据特征与分类目标之间的线性假设,我们让然可以在科学研究与工程实践中把线性分类器的表现性能作为基准。逻辑斯蒂对参数的计算采用精确解析的方法,计算时间长但是模型性能高,随机梯度下降采用随机梯度上升算法估计模型参数,计算时间短但产出的模型性能略低,一般而言,对于训练数据规模在10万量级以上的数据,考虑到时间的耗用,推荐使用随机梯度算法
网友评论