机器学习5- 对数几率回归+Python实现

简介:

机器学习5- 对数几率回归+Python实现

目录

  1. 对数几率回归
    1.1 求解 ω 和 b
  2. 对数几率回归进行垃圾邮件分类
    2.1 垃圾邮件分类

2.2 模型评估
混淆举证
精度
交叉验证精度
准确率召回率
F1 度量
ROC AUC

  1. 对数几率回归
    考虑二分类任务,其输出标记 y∈{0,1}y∈{0,1},记线性回归模型产生的预测值 z=wTx+bz=wTx+b 是实值,于是我们需要一个将实值 zz 转换为 0/10/1 的 g−(⋅)g−(⋅)。

最理想的单位阶跃函数(unit-step function)

y=⎧⎩⎨0,0.5,1,z<0z=0z>0(1.1)(1.1)y={0,z<00.5,z=01,z>0
并不是连续函数,因此不能作为 g−(⋅)g−(⋅) 。于是我们选用对数几率函数(logistics function)作为单位阶跃函数的替代函数(surrogate function):

y=11+e−z(1.2)(1.2)y=11+e−z
如下图所示:

对数几率函数是 Sigmoid 函数(即形似 S 的函数)的一种。

将对数几率函数作为 g−(⋅)g−(⋅) 得到

y=11+e−(wTx+b)(1.3)(1.3)y=11+e−(wTx+b)
lny1−y=wTx+b(1.4)(1.4)ln⁡y1−y=wTx+b
若将 yy 视为样本 xx 为正例的可能性,则 1−y1−y 是其为反例的可能性,两者的比值为

y1−y(1.5)(1.5)y1−y
称为几率(odds),反映了 xx 作为正例的相对可能性。对几率取对数得到对数几率(log odds,或 logit):

lny1−y(1.6)(1.6)ln⁡y1−y
所以,式 (1.3) 实际上是用线性回归模型的预测结果取逼近真实标记的对数几率,因此其对应的模型又称为对数几率回归(logistic regression, 或 logit regression)。

这种分类学习方法直接对分类可能性进行建模,无需事先假设数据分布,避免了假设分布不准确带来的问题;
它能得到近似概率预测,这对需要利用概率辅助决策的任务很有用;
对率函数是任意阶可导的凸函数,有很好的数学性质,许多数值优化算法都可直接用于求解最优解。

1.1 求解 ω 和 b
将式 (1.3) 中的 yy 视为类后验概率估计 p(y=1|x)p(y=1|x),则式 (1.4) 可重写为

lnp(y=1|x)p(y=0|x)=wTx+b(1.7)(1.7)ln⁡p(y=1|x)p(y=0|x)=wTx+b

p(y=1|x)=ewTx+b1+ewTx+b(1.8)(1.8)p(y=1|x)=ewTx+b1+ewTx+b
p(y=0|x)=11+ewTx+b(1.9)(1.9)p(y=0|x)=11+ewTx+b
通过极大似然法(maximum likelihood method)来估计 ww 和 bb 。

给定数据集 {(xi,yi)}mi=1{(xi,yi)}i=1m,对率回归模型最大化对数似然(log-likelihood):

ℓ(w,b)=∑i=1mlnp(yi|xi;w,b)(1.10)(1.10)ℓ(w,b)=∑i=1mln⁡p(yi|xi;w,b)
即令每个样本属于其真实标记的概率越大越好。

令 β=(w;b)β=(w;b),x^=(x;1)x^=(x;1),则 wTx+bwTx+b 可简写为 βTx^βTx^。再令 p1(x^;β)=p(y=1|x^;β)p1(x^;β)=p(y=1|x^;β),p0(x^;β)=p(y=0|x^;β)=1−p1(x^;β)p0(x^;β)=p(y=0|x^;β)=1−p1(x^;β) 。则式 (1.10) 可简写为:

p(yi|xi;w,b)=yip1(x^;β)+(1−yi)p0(x^;β)(1.11)(1.11)p(yi|xi;w,b)=yip1(x^;β)+(1−yi)p0(x^;β)
将式 (1.11) 带入 (1.10),并根据式 (1.8) 和 (1.9) 可知,最大化式 (1.10) 等价于最小化

ℓ(β)=∑i=1m(−yiβTx^i+ln(1+eβT+x^i))(1.12)(1.12)ℓ(β)=∑i=1m(−yiβTx^i+ln⁡(1+eβT+x^i))
式 (1.12) 是关于 ββ 的高阶可导凸函数,根据凸优化理论,经典的数值优化算法如梯度下降法(gradient descent method)、牛顿法(Newton method)等都可求得其最优解,于是得到:

β∗=arg min βℓ(β)(1.13)(1.13)β∗=arg min βℓ(β)
以牛顿法为例, 其第 t+1t+1 轮迭代解的更新公式为:

βt+1=βt−(∂2ℓ(β)∂β ∂βT)−1∂ℓ(β)∂β(1.14)(1.14)βt+1=βt−(∂2ℓ(β)∂β ∂βT)−1∂ℓ(β)∂β
其中关于 ββ 的一阶、二阶导数分别为:

∂ℓ(β)∂β=−∑i=1mx^i(yi−p1(x^i;β))(1.15)(1.15)∂ℓ(β)∂β=−∑i=1mx^i(yi−p1(x^i;β))
∂2ℓ(β)∂β∂βT=∑i=1mx^ix^Tip1(x^i;β)(1−p1(x^i;β))(1.16)(1.16)∂2ℓ(β)∂β∂βT=∑i=1mx^ix^iTp1(x^i;β)(1−p1(x^i;β))

  1. 对数几率回归进行垃圾邮件分类
    2.1 垃圾邮件分类

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model.logistic import LogisticRegression
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.feature_extraction.text import TfidfVectorizer
from matplotlib.font_manager import FontProperties
df = pd.read_csv("SMSSpamCollection", delimiter='t', header=None)
df.head()

print("spam 数量: ", df[df[0] == 'spam'][0].count())
print("ham 数量: ", df[df[0] == 'ham'][0].count())
spam 数量: 747
ham 数量: 4825
X_train_raw, X_test_raw, y_train, y_test = train_test_split(df[1], df[0])

计算TF-IDF权重

vectorizer = TfidfVectorizer()
X_train = vectorizer.fit_transform(X_train_raw)
X_test = vectorizer.transform(X_test_raw)

建立模型

classifier = LogisticRegression()
classifier.fit(X_train, y_train)
y_preds = classifier.predict(X_test)
for i, y_pred in enumerate(y_preds[-10:]):

print("预测类型: %s -- 信息: %s" % (y_pred, X_test_raw.iloc[i]))

预测类型: ham -- 信息: Aight no rush, I'll ask jay
预测类型: ham -- 信息: Sos! Any amount i can get pls.
预测类型: ham -- 信息: You unbelievable faglord
预测类型: ham -- 信息: Carlos'll be here in a minute if you still need to buy
预测类型: spam -- 信息: Meet after lunch la...
预测类型: ham -- 信息: Hey tmr maybe can meet you at yck
预测类型: ham -- 信息: I'm on da bus going home...
预测类型: ham -- 信息: O was not into fps then.
预测类型: ham -- 信息: Yes..he is really great..bhaji told kallis best cricketer after sachin in world:).very tough to get out.
预测类型: ham -- 信息: Did you show him and wot did he say or could u not c him 4 dust?
2.2 模型评估
混淆举证
test = y_test
test[test == "ham"] = 0
test[test == "spam"] = 1

pred = y_preds
pred[pred == "ham"] = 0
pred[pred == "spam"] = 1
from sklearn.metrics import confusion_matrix
test = test.astype('int')
pred = pred.astype('int')
confusion_matrix = confusion_matrix(test.values, pred)
print(confusion_matrix)
plt.matshow(confusion_matrix)
font = FontProperties(fname=r"/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc")
plt.title(' 混淆矩阵',fontproperties=font)
plt.colorbar()
plt.ylabel(' 实际类型',fontproperties=font)
plt.xlabel(' 预测类型',fontproperties=font)
plt.show()
[[1191 1]
[ 50 151]]

精度
from sklearn.metrics import accuracy_score

print(accuracy_score(test.values, pred))
0.9633883704235463
交叉验证精度
df = pd.read_csv("sms.csv")
df.head()

X_train_raw, X_test_raw, y_train, y_test = train_test_split(df['message'], df['label'])
vectorizer = TfidfVectorizer()
X_train = vectorizer.fit_transform(X_train_raw)
X_test = vectorizer.transform(X_test_raw)
classifier = LogisticRegression()
classifier.fit(X_train, y_train)
scores = cross_val_score(classifier, X_train, y_train, cv=5)
print(' 精度:',np.mean(scores), scores)
精度: 0.9562200956937799 [0.94736842 0.95933014 0.95574163 0.95574163 0.96291866]
准确率召回率
precisions = cross_val_score(classifier, X_train, y_train, cv=5, scoring='precision')
print('准确率:', np.mean(precisions), precisions)
recalls = cross_val_score(classifier, X_train, y_train, cv=5, scoring='recall')
print('召回率:', np.mean(recalls), recalls)
准确率: 0.9920944081237428 [0.98550725 1. 1. 0.98701299 0.98795181]
召回率: 0.6778796653796653 [0.61261261 0.69642857 0.66964286 0.67857143 0.73214286]
F1 度量
f1s = cross_val_score(classifier, X_train, y_train, cv=5, scoring='f1')
print(' 综合评价指标:', np.mean(f1s), f1s)
综合评价指标: 0.8048011339652206 [0.75555556 0.82105263 0.80213904 0.8042328 0.84102564]
ROC AUC
from sklearn.metrics import roc_curve, auc
predictions = classifier.predict_proba(X_test)
false_positive_rate, recall, thresholds = roc_curve(y_test, predictions[:, 1])
roc_auc = auc(false_positive_rate, recall)
plt.title('Receiver Operating Characteristic')
plt.plot(false_positive_rate, recall, 'b', label='AUC = %0.2f' % roc_auc)
plt.legend(loc='lower right')
plt.plot([0, 1], [0, 1], 'r--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.0])
plt.ylabel('Recall')
plt.xlabel('Fall-out')
plt.show()

原文地址https://www.cnblogs.com/raina/p/12777725.html

相关文章
|
1天前
|
机器学习/深度学习 算法 Python
深入浅出Python机器学习:从零开始的SVM教程/厾罗
深入浅出Python机器学习:从零开始的SVM教程/厾罗
|
8天前
|
机器学习/深度学习 边缘计算 TensorFlow
【Python机器学习专栏】Python机器学习工具与库的未来展望
【4月更文挑战第30天】本文探讨了Python在机器学习中的关键角色,重点介绍了Scikit-learn、TensorFlow和PyTorch等流行库。随着技术进步,未来Python机器学习工具将聚焦自动化、智能化、可解释性和可信赖性,并促进跨领域创新,结合云端与边缘计算,为各领域应用带来更高效、可靠的解决方案。
|
8天前
|
机器学习/深度学习 传感器 物联网
【Python机器学习专栏】机器学习在物联网(IoT)中的集成
【4月更文挑战第30天】本文探讨了机器学习在物联网(IoT)中的应用,包括数据收集预处理、实时分析决策和模型训练更新。机器学习被用于智能家居、工业自动化和健康监测等领域,例如预测居民行为以优化能源效率和设备维护。Python是支持物联网项目机器学习集成的重要工具,文中给出了一个使用`scikit-learn`预测温度的简单示例。尽管面临数据隐私、安全性和模型解释性等挑战,但物联网与机器学习的结合将持续推动各行业的创新和智能化。
|
8天前
|
机器学习/深度学习 数据采集 算法
【Python 机器学习专栏】机器学习在医疗诊断中的前沿应用
【4月更文挑战第30天】本文探讨了机器学习在医疗诊断中的应用,强调其在处理复杂疾病和大量数据时的重要性。神经网络、决策树和支持向量机等方法用于医学影像诊断、疾病预测和基因数据分析。Python作为常用工具,简化了模型构建和数据分析。然而,数据质量、模型解释性和伦理法律问题构成挑战,需通过数据验证、可解释性研究及建立规范来应对。未来,机器学习将更深入地影响医疗诊断,带来智能和精准的诊断工具,同时也需跨学科合作推动其健康发展。
|
8天前
|
机器学习/深度学习 分布式计算 物联网
【Python机器学习专栏】联邦学习:保护隐私的机器学习新趋势
【4月更文挑战第30天】联邦学习是保障数据隐私的分布式机器学习方法,允许设备在本地训练数据并仅共享模型,保护用户隐私。其优势包括数据隐私、分布式计算和模型泛化。应用于医疗、金融和物联网等领域,未来将发展更高效的数据隐私保护、提升可解释性和可靠性的,并与其他技术融合,为机器学习带来新机遇。
|
8天前
|
机器学习/深度学习 自然语言处理 搜索推荐
【Python机器学习专栏】迁移学习在机器学习中的应用
【4月更文挑战第30天】迁移学习是利用已有知识解决新问题的机器学习方法,尤其在数据稀缺或资源有限时展现优势。本文介绍了迁移学习的基本概念,包括源域和目标域,并探讨了其在图像识别、自然语言处理和推荐系统的应用。在Python中,可使用Keras或TensorFlow实现迁移学习,如示例所示,通过预训练的VGG16模型进行图像识别。迁移学习提高了学习效率和性能,随着技术发展,其应用前景广阔。
|
8天前
|
机器学习/深度学习 人工智能 算法
【Python 机器学习专栏】强化学习在游戏 AI 中的实践
【4月更文挑战第30天】强化学习在游戏AI中展现巨大潜力,通过与环境交互和奖励信号学习最优策略。适应性强,能自主探索,挖掘出惊人策略。应用包括策略、动作和竞速游戏,如AlphaGo。Python是实现强化学习的常用工具。尽管面临训练时间长和环境复杂性等挑战,但未来强化学习将与其他技术融合,推动游戏AI发展,创造更智能的游戏体验。
|
2天前
|
机器学习/深度学习 人工智能 算法
探索机器学习中的支持向量机(SVM)算法
【5月更文挑战第6天】在数据科学和人工智能的广阔天地中,支持向量机(SVM)以其强大的分类能力与理论深度成为机器学习领域中的一个闪亮的星。本文将深入探讨SVM的核心原理、关键特性以及实际应用案例,为读者提供一个清晰的视角来理解这一高级算法,并展示如何利用SVM解决实际问题。
22 7
|
2天前
|
机器学习/深度学习 人工智能 算法
探索机器学习中的支持向量机算法
【5月更文挑战第6天】 在数据科学和人工智能领域,支持向量机(SVM)是一种强大的监督学习模型,它凭借其出色的分类能力在众多机器学习任务中占据重要地位。本文旨在深入剖析支持向量机的工作原理,探讨其在高维数据处理中的优势以及面对大规模数据集时的应对策略。通过对核技巧、软间隔以及优化问题的讨论,我们将揭示SVM如何优雅地处理线性不可分问题,并保持模型的泛化性能。
|
6天前
|
机器学习/深度学习 自然语言处理 算法
机器学习算法原理与应用:深入探索与实战
【5月更文挑战第2天】本文深入探讨机器学习算法原理,包括监督学习(如线性回归、SVM、神经网络)、非监督学习(聚类、PCA)和强化学习。通过案例展示了机器学习在图像识别(CNN)、自然语言处理(RNN/LSTM)和推荐系统(协同过滤)的应用。随着技术发展,机器学习正广泛影响各领域,但也带来隐私和算法偏见问题,需关注解决。