您的位置:首页 > 编程语言 > Python开发

Python机器学习及实践——基础篇2(LR和SGD)

2018-02-03 14:01 232 查看
 使用线性分类模型从事良/恶性肿瘤预测任务

# 从sklearn.preprocessing里导入StandardScaler。
from sklearn.preprocessing import StandardScaler
# 从sklearn.linear_model里导入LogisticRegression与SGDClassifier。
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)

# 调用SGDClassifier中的fit函数/模块用来训练模型参数。
sgdc.fit(X_train, y_train)
# 使用训练好的模型sgdc对X_test进行预测,结果储存在变量sgdc_y_predict中。
sgdc_y_predict = sgdc.predict(X_test)

 在上述代码中,我们分别利用LogisticRegression和SGDClassifier针对171条测试样本进行预测工作。由于这171条测试样本拥有正确标记,并记录在变量y_test中,因此非常直观的做法是对比预测结果和原本正确标记,计算171条测试样本中,预测正确的百分比。我们把这个百分比称作准确性,并且将其作为评估分类模型的一个重要性能指标。
 然而,在许多实际问题中,我们往往更加关注模型对某一特定类别的预测能力。这时,准确性指标就变得笼统了。比如,在“良/恶性肿瘤预测任务”里,医生和患者往往更加关心有多少恶性肿瘤被正确地诊断出来,因为这种肿瘤更加致命。也就是说,在二分类任务下,预测结果和正确标记之间存在4种不同的组合,构成混淆矩阵。如果恶性肿瘤为阳性(Positive),良性肿瘤为阴性(Negative),那么,预测正确的恶性肿瘤即为真阳性(True
Positive),预测正确的良性肿瘤为真阴性(True Negative);原本是良性肿瘤,误判为恶性肿瘤的为假阳性(False Positive),实际是恶性肿瘤,但是模型没有检测出来,则为假阴性(False Negative)。事实上,医生和患者最不愿看到的是有假阴性的结果,因为这种误诊会耽误病患的治疗,进而危及生命。

 除了准确性之外,还有两个评价指标,分别是召回率(Recall)和精确率(Precision)。为了综合考量召回率与精确率,计算这两个指标的调和平均数,得到F1指标。具体的公式网上已有很多,这里就不在赘述。
 回到任务,对于乳腺癌肿瘤预测的问题,我们显然更加关注召回率,就是应该被正确识别的恶性肿瘤的百分比。我们分析一下下面的代码,来看两个模型在上述4个指标的表现情况。

# 从sklearn.metrics里导入classification_report模块。
from sklearn.metrics import classification_report

# 使用逻辑斯蒂回归模型自带的评分函数score获得模型在测试集上的准确性结果。
print 'Accuracy of LR Classifier:', lr.score(X_test, y_test)
# 利用classification_report模块获得LogisticRegression其他三个指标的结果。
print classification_report(y_test, lr_y_predict, target_names=['Benign', 'Malignant'])
Accuracy of LR Classifier: 0.988304093567
precision    recall  f1-score   support
Benign       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 'Accuarcy of SGD Classifier:', sgdc.score(X_test, y_test)
# 利用classification_report模块获得SGDClassifier其他三个指标的结果。
print classification_report(y_test, sgdc_y_predict, target_names=['Benign', 'Malignant'])
Accuarcy of SGD Classifier: 0.941520467836
precision    recall  f1-score   support
Benign       0.92      0.98      0.95       100
Malignant       0.97      0.89      0.93        71
avg / total       0.94      0.94      0.94       171

 看到代码的输出,我们可以发现,LogisticRegression比起SGDClassifier在测试集上表现有更高的准确性。这是因为Scikit-learn中采用解析的方式精确计算LogisticRegression,而使用梯度法估计SGDClassifier的参数。

 特点分析:线性分类器可以说是最为基本和常用的机器学习模型。尽管其受限制于数据特征与分类目标之间的线性假设,我们仍然可以在科学研究与工程实践中把线性分类器的表现性能作为基准。这里所使用的的模型包括LogisticRegression和LogisticRegression。相比之下,前者对于参数的计算采用精确解析的方式,计算时间长但是模型性能略高;后者采用了随机梯度上升算法估计模型参数,计算时间短但是产出的模型性能略低。一般而言,对于训练数据规模在10万量级以上的数据,考虑到时间的耗用,更加推荐使用随机梯度算法对模型参数进行估计。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息