scikit-learn学习笔记(五)Logistic regression(逻辑回归)
来源:互联网 发布:精通c语言能做什么知乎 编辑:程序博客网 时间:2024/06/07 20:10
逻辑函数(logistic function)
为了更好地解释逻辑回归,让我们首先了解一下逻辑函数。逻辑函数由于它的S形,有时也被称为sigmoid函数。
现在我要引入比值比(odds ratio)的概念,它可以被写成
它的函数图像如下:
从图像上我们可以看出,logit函数输入0到1的值并把它们转换为整个实数范围内的值。上面的
但是在实际应用中,我们更想求的是
import matplotlib.pyplot as pltimport numpy as npdef sigmoid(h): return 1.0 / (1.0 + np.exp(-h))h = np.arange(-10, 10, 0.1) # 定义x的范围,像素为0.1s_h = sigmoid(h) # sigmoid为上面定义的函数plt.plot(h, s_h)plt.axvline(0.0, color='k') # 在坐标轴上加一条竖直的线,0.0为竖直线在坐标轴上的位置plt.axhspan(0.0, 1.0, facecolor='1.0', alpha=1.0, ls='dotted') # 加水平间距通过坐标轴plt.axhline(y=0.5, ls='dotted', color='k') # 加水线通过坐标轴plt.yticks([0.0, 0.5, 1.0]) # 加y轴刻度plt.ylim(-0.1, 1.1) # 加y轴范围plt.xlabel('h')plt.ylabel('$S(h)$')plt.show()
从上图我们可以看出,函数接收整个实数范围的输入,输出0到1之间的数。
因此
这个概率我们可以解释成:给定用权重
还有一个等价的公式如下:
实际上,很多应用不只仅仅是想得到一个类标签,而是算出属于某个类别的概率。比如逻辑回归就是这样的,它不仅仅是告诉你是否患有疾病,而是告诉你有多大概率患有这个疾病。
在上面的例子当中,我们一直都看到权重
最大似然估计(maximum likelihood)
这个方法的本质就是:选择最佳的参数值
假设我们给定样本
|w)
实际上,可能性函数就是样本数据作为参数
如果
但是,如果我们有很多的样本数据呢?这时,你就会乘上很多项,这些项通常都很小,可能性函数就会变得很小。因此,你应该采用log可能性函数。第一,如果在可能性很小的时候它可以防止潜在的数值下溢;第二,我们把乘积转换为求和,这可以使我们更加容易求得函数的导数。第三,log函数是单调的,最大化可能性函数的值也就是最大化log可能性函数的值。log可能性函数公式如下:
下面,我举2个例子来应用一下这个强大的工具:
1、假设你口袋里有2枚硬币,1枚硬币出现正面的概率为
答:通过问题我们可以得出这个是属于二项分布。它的概率为
P(x|n,p)=(nx)px(1−p)n−x .现在,我们来写出log可能性函数:
l(p)=log((43)p3(1−p)) 由于我们已经给出了p的值只能为0.5或0.8,因此,我们不必求导来算出
p 的值最大化可能性。这里我们只需要把两个p 值代入就行了,分别得出如下结果:l(0.5)=−0.6021 l(0.8)=−0.3876
因此当p 为0.8时,使可能性函数更大,所以我更可能拿出的是正面概率为p=0.8 的硬币。
2、假设
答:log可能性函数如下:
l(μ,σ2)=∑i=1nlog[1σ2π−−√exp(−(Xi−μ2)2σ2)]=−∑i=1nlog(σ)−∑i=1nlog(2π−−√)−∑i=1n[(Xi−μ)22σ2]=−nlog(σ)−nlog(2π−−√)−12σ2∑i=1n(Xi−μ)2
因为我们想找到参数
μ和σ 使得可能性函数最大,因此我们需要找到它们的偏导:
∂l(μ,σ2)∂μ=∂∂μ(−nlog(σ)−nlog(2π−−√)
−12σ2∑i=1n(Xi−μ)2)=−1σ2∑i=1n(Xi−μ)
∂l(μ,σ2)∂σ2=∂∂σ2(−n2log(σ2)−nlog(2π−−√)−12(σ2)−1∑i=1n(Xi−μ)2)=−n2σ2+12(σ2)−2∑i=1n(Xi−μ)2
让两个偏导都等于0,然后求出最佳参数。
μ=1n∑i=1nXi=X¯
σ2=1n∑i=1n(Xi−μ)2
掌握了最大似然估计,现在你就可以知道逻辑回归cost函数的由来了。
逻辑回归的cost函数
现在,我们可以用可能性函数来定义上面的权重
上面公式中的h为假设函数
现在,我们的目的是最大化log可能性函数,找到一个最佳的权重
n :训练集样本总数S :sigmoid函数h :假设函数
假设我们只有一个样本,现在我们可以把上面的cost函数拆分成分段函数如下:
J(w)=⎧⎩⎨−log(S(h)),−log(1−S(h)),if y = 1if y = 0
我们把逻辑回归的cost函数做成了图像如上。当实际类别为1时,如果我们预测为1则需要很小的cost,如果我们预测为0则需要很大的cost;反过来,当实际类别为0时,如果我们预测为0则需要很小的cost,如果我们预测为1则需要很大的cost。
Iris数据集概述
首先,我们取得数据,下面这个链接中有数据的详细介绍,并可以下载数据集。
https://archive.ics.uci.edu/ml/datasets/Iris
从数据的说明上,我们可以看到Iris有4个特征,3个类别。但是,我们为了数据的可视化,我们只保留2个特征(sepal length和petal length)。让我们先看看数据集的散点图吧!
下面,我们进入Ipython命令行。
import pandas as pdimport matplotlib.pyplot as pltimport numpy as npdf = pd.read_csv('http://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data', header=None) # 加载Iris数据集作为DataFrame对象X = df.iloc[:, [0, 2]].values # 取出2个特征,并把它们用Numpy数组表示plt.scatter(X[:50, 0], X[:50, 1],color='red', marker='o', label='setosa') # 前50个样本的散点图plt.scatter(X[50:100, 0], X[50:100, 1],color='blue', marker='x', label='versicolor') # 中间50个样本的散点图plt.scatter(X[100:, 0], X[100:, 1],color='green', marker='+', label='Virginica') # 后50个样本的散点图plt.xlabel('petal length')plt.ylabel('sepal length')plt.legend(loc=2) # 把说明放在左上角,具体请参考官方文档plt.show()
从上图我们可以看出,数据集是线性可分的。为了更好地演示效果,我只用setosa和versicolor这两个类别。
接下来,我们要用强大的scikit-learn来拟合模型。
下面,我将用scikit-learn来训练一个逻辑回归模型:
from sklearn import datasetsimport numpy as npfrom sklearn.cross_validation import train_test_splitiris = datasets.load_iris()X = iris.data[:, [2, 3]]y = iris.targetX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)from sklearn.preprocessing import StandardScalersc = StandardScaler()sc.fit(X_train)X_train_std = sc.transform(X_train)X_test_std = sc.transform(X_test)X_combined_std = np.vstack((X_train_std, X_test_std))y_combined = np.hstack((y_train, y_test))from sklearn.linear_model import LogisticRegressionlr = LogisticRegression(C=1000.0, random_state=0)lr.fit(X_train_std, y_train)lr.predict_proba(X_test_std[0,:]) # 查看第一个测试样本属于各个类别的概率plot_decision_regions(X_combined_std, y_combined, classifier=lr, test_idx=range(105,150))plt.xlabel('petal length [standardized]')plt.ylabel('petal width [standardized]')plt.legend(loc='upper left')plt.show()
从上图我们看到逻辑回归模型把类别很好地分开了。- scikit-learn学习笔记(五)Logistic regression(逻辑回归)
- 机器学习之逻辑回归 Logistic Regression(三)scikit-learn算法库
- 逻辑回归(Logistic regression)详解-并用scikit-learn训练逻辑回归拟合Iris数据集
- 逻辑回归(Logistic regression)详解-并用scikit-learn训练逻辑回归拟合Iris数据集
- sklearn(scikit-learn) logistic regression loss(cost) function(sklearn中逻辑回归的损失函数)
- scikit-learn学习笔记(四)Ridge Regression ( 岭回归 )
- 学习笔记:逻辑斯蒂回归(logistic regression)
- 逻辑斯蒂回归(logistic regression)学习笔记
- [机器学习] Coursera ML笔记 - 逻辑回归(Logistic Regression)
- 机器学习-logistic Regression(逻辑回归)
- 机器学习方法(五):逻辑回归Logistic Regression,Softmax Regression
- 逻辑回归(logistic regression)
- 逻辑回归(Logistic Regression)
- 逻辑回归(Logistic Regression)
- 逻辑回归(Logistic Regression)
- 逻辑回归(Logistic Regression)
- 逻辑回归(Logistic Regression)
- 逻辑回归(Logistic Regression)
- 可以使用的idea license key
- WordPress迁移至VPS的那些坑
- getHarmonic函数
- LintCode1
- java 学习之路
- scikit-learn学习笔记(五)Logistic regression(逻辑回归)
- PowerDesigner16.5 自定义默认值去除引号
- STM32 F103USB官方例程枚举知识
- JS的迭代公式
- hdu4221 Greedy?
- win10异常关机重启黑屏只有鼠标
- XML和json的区别?
- Ubuntu下编译VeraCrypt
- 进程通信-Linux