@77qingliu
2018-05-02T13:54:23.000000Z
字数 5287
阅读 1436
machine-learning
对数几率回归(Logistic Regression),简称为对率回归,也称逻辑斯蒂回归,或者逻辑回归,是统计学习中经典的分类模型。Logisitc模型是广义线性模型中的一类。在业界有相关广泛的应用。常见的如信用评分模型,用于判定某个人的违约概率。
这里从统计学角度,引用周志华西瓜书里的思路,从线性回归开始,逐步讲Logistic回归。
给定一个由个属性描述的示例 ,其中是在第个属性上的取值,线性模型试图学得一个通过属性的线性组合来进行预测的函数,即
线性模型很简单,也很容易理解。但是真实世界中,并不是所有数据都是简单的线性关系。那么,我们能否令模型的预测值逼近的衍生物呢?例如,假设我们认为观测与输出是在指数尺度上变化,那就可以将输出的对数作为模型逼近的目标,即

更一般地,考虑单调可微函数,令
上面我们讨论了线性回归,但是如果要做分类任务该怎么办?答案就在上述“广义线性模型”中:只需要找到一个单调可微的函数将预测值变为分类值。
符合这个函数有很多,其中一种就是Sigmoid函数(为什么 LR 模型要使用 sigmoid 函数):

从图中可看出,Sigmoid函数将输出转化为一个接近0或接近1的值。将Sigmoid函数作为代入广义线性模型中,得到
上式可变化为
对于给定的数据集 ,其中,。Logistic回归的参数可以应用”极大似然估计法“进行估计。模型可重写为
要找到某函数的最大值(或最小值),最好的方法是沿着该函数的梯度方向探寻。如果梯度记为,则函数的梯度由下式表示

梯度下降算法
1. 选取一个合适的步长α(比较常见的步长:0.001, 0.003, 0.01, 0.03, 0.1, 0.3)
2. 随机选取一组参数的值
3. 计算这个当前参数的梯度, 沿着梯度的反方向,根据步长计算新的参数的值
4. 重复上述步骤直到损失函数收敛到一定值
对于Logistic回归来说。记
这里使用周志华-机器学习里面的西瓜数据集-使用Logistic回归分类器判断西瓜的好坏。
具体的数据集如下:
| 编号 | 色泽 | 根蒂 | 敲声 | 纹理 | 脐部 | 触感 | 密度 | 含糖率 | 好瓜 |
|---|---|---|---|---|---|---|---|---|---|
| 1 | 青绿 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 0.697 | 0.46 | 是 |
| 2 | 乌黑 | 蜷缩 | 沉闷 | 清晰 | 凹陷 | 硬滑 | 0.774 | 0.376 | 是 |
| 3 | 乌黑 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 0.634 | 0.264 | 是 |
| 4 | 青绿 | 蜷缩 | 沉闷 | 清晰 | 凹陷 | 硬滑 | 0.608 | 0.318 | 是 |
| 5 | 浅白 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 0.556 | 0.215 | 是 |
| 6 | 青绿 | 稍蜷 | 浊响 | 清晰 | 稍凹 | 软粘 | 0.403 | 0.237 | 是 |
| 7 | 乌黑 | 稍蜷 | 浊响 | 稍糊 | 稍凹 | 软粘 | 0.481 | 0.149 | 是 |
| 8 | 乌黑 | 稍蜷 | 浊响 | 清晰 | 稍凹 | 硬滑 | 0.437 | 0.211 | 是 |
| 9 | 乌黑 | 稍蜷 | 沉闷 | 稍糊 | 稍凹 | 硬滑 | 0.666 | 0.091 | 否 |
| 10 | 青绿 | 硬挺 | 清脆 | 清晰 | 平坦 | 软粘 | 0.243 | 0.267 | 否 |
| 11 | 浅白 | 硬挺 | 清脆 | 模糊 | 平坦 | 硬滑 | 0.245 | 0.057 | 否 |
| 12 | 浅白 | 蜷缩 | 浊响 | 模糊 | 平坦 | 软粘 | 0.343 | 0.099 | 否 |
| 13 | 青绿 | 稍蜷 | 浊响 | 稍糊 | 凹陷 | 硬滑 | 0.639 | 0.161 | 否 |
| 14 | 浅白 | 稍蜷 | 沉闷 | 稍糊 | 凹陷 | 硬滑 | 0.657 | 0.198 | 否 |
| 15 | 乌黑 | 稍蜷 | 浊响 | 清晰 | 稍凹 | 软粘 | 0.36 | 0.37 | 否 |
| 16 | 浅白 | 蜷缩 | 浊响 | 模糊 | 平坦 | 硬滑 | 0.593 | 0.042 | 否 |
| 17 | 青绿 | 蜷缩 | 沉闷 | 稍糊 | 稍凹 | 硬滑 | 0.719 | 0.103 | 否 |
根据色泽、根蒂、敲声、纹理、脐部、触感、密度、含糖率这些特征,对测试例1进行分类。
| 编号 | 色泽 | 根蒂 | 敲声 | 纹理 | 脐部 | 触感 | 密度 | 含糖率 | 好瓜 |
|---|---|---|---|---|---|---|---|---|---|
| 测1 | 青绿 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 0.697 | 0.46 | ? |
Sklearn代码实现
读入数据
import numpy as npfrom io import StringIOimport pandas as pdimport mathimport refrom sklearn.preprocessing import LabelEncoder, OneHotEncoderfrom sklearn.linear_model import LogisticRegressiondef createDataSet():''' 数据读入 '''rawData = StringIO("""编号,色泽,根蒂,敲声,纹理,脐部,触感,密度,含糖率,好瓜1,青绿,蜷缩,浊响,清晰,凹陷,硬滑,0.697,0.46,是2,乌黑,蜷缩,沉闷,清晰,凹陷,硬滑,0.774,0.376,是3,乌黑,蜷缩,浊响,清晰,凹陷,硬滑,0.634,0.264,是4,青绿,蜷缩,沉闷,清晰,凹陷,硬滑,0.608,0.318,是5,浅白,蜷缩,浊响,清晰,凹陷,硬滑,0.556,0.215,是6,青绿,稍蜷,浊响,清晰,稍凹,软粘,0.403,0.237,是7,乌黑,稍蜷,浊响,稍糊,稍凹,软粘,0.481,0.149,是8,乌黑,稍蜷,浊响,清晰,稍凹,硬滑,0.437,0.211,是9,乌黑,稍蜷,沉闷,稍糊,稍凹,硬滑,0.666,0.091,否10,青绿,硬挺,清脆,清晰,平坦,软粘,0.243,0.267,否11,浅白,硬挺,清脆,模糊,平坦,硬滑,0.245,0.057,否12,浅白,蜷缩,浊响,模糊,平坦,软粘,0.343,0.099,否13,青绿,稍蜷,浊响,稍糊,凹陷,硬滑,0.639,0.161,否14,浅白,稍蜷,沉闷,稍糊,凹陷,硬滑,0.657,0.198,否15,乌黑,稍蜷,浊响,清晰,稍凹,软粘,0.36,0.37,否16,浅白,蜷缩,浊响,模糊,平坦,硬滑,0.593,0.042,否17,青绿,蜷缩,沉闷,稍糊,稍凹,硬滑,0.719,0.103,否""")df = pd.read_csv(rawData, sep=",")return dfdf = createDataSet()df.head()
重新编码数据
# re-encodingcolumns = ['色泽', '根蒂', '敲声', '纹理', '脐部', '触感']df_dummy = pd.get_dummies(df, columns=columns)
建立模型
# Model fittingLR = LogisticRegression()x = df_dummy.drop(['好瓜', '编号'], axis=1)y = df['好瓜']LR_fit = LR.fit(x, y)to_predit = x.iloc[0].values.reshape(1, -1)predit = LR_fit.predict(to_predit)
输出结果
def series2string(series):string = series.to_string().split('\n')s = [re.sub(' +', ': ', s) for s in string]return ', '.join(s)series2string(df.iloc[0].drop(['编号', '好瓜']))print('The predit value for [{0}] - 好瓜[{1}] '.format(series2string(df.iloc[0].drop(['编号', '好瓜'])), predit[0]))>> The predit value for [色泽: 青绿, 根蒂: 蜷缩, 敲声: 浊响, 纹理: 清晰, 脐部: 凹陷, 触感: 硬滑, 密度: 0.697, 含糖率: 0.46] = 好瓜[是]
最后将测试样例预测为好瓜。