机器学习16:逻辑回归模型

2019-08-08 15:18:41 浏览数 (1)

逻辑回归模型是对线性回归模型解决分类任务的改进,是广义线性模型。它可以被看做是Sigmoid函数(logistic方程)所归一化后的线性回归模型,主要用于二分类问题。Sigmoid函数形式为:

Sigmoid函数有一个重要的性质,在计算中被常用到:

结合sigmoid函数,线性回归函数,把线性回归模型的输出θx(也即wx) 作为sigmoid函数的输入,以保证其输出为0/1二值型,适应于二分类问题。于是最后就变成了逻辑回归模型:

1.1,损失函数:

由于逻辑回归模型只有两个标签1和0,模型y的值等于标签为1的概率也就是p:

因此,单个样本看做一个事件,那么这个事件发生的概率就是:

即,当y=1,P(yi| xi) = p;当y=0,P(yi | xi) = 1-p。

1.2,极大似然估计:

实践中,最常用的是极大似然估计法来对逻辑回归的参数进行估计:逻辑回归输出的是实例输入每个类别的似然概率,似然概率最大的类别就是分类结果。

假设我们采集到了一组数据一共N个,采集到这组样本的概率,即这组样本中每个样本同时发生的概率:

取log,得到:

将上述F(W)取负数就得到了逻辑回归的损失函数,有时也被称为交叉熵损失函数。损失函数是衡量模型的输出结果跟实际的输出结果之间的差距的一种函数,这里的损失函数的值等于事件发生的总概率的取负数。

于是,最终的问题转化为寻找一个最优的w* :

这样,问题就变成了以对数似然函数为目标函数的最优化问题,逻辑回归学习中通常采用的优化学习算法是梯度下降法和拟牛顿法

最终,我们学习到的逻辑回归模型为(w^即为w*):

2, Softmax回归:

Softmax回归是logistic回归的一般化,适用于K分类的问题。Softmax函数的本质就是将一个K维的任意实数向量压缩(映射)成另一个K维 的实数向量,其中向量中的每个元素取值都介于(0,1)之间。Softmax回归的概率函数为:

Softmax回归的极大似然估计与二分类相似:

同样,问题变成了以对数似然函数为目标函数的最优化问题,多分类的Softmax回归学习也可以采用的优化学习算法是梯度下降法和拟牛顿法

3,判别模型与生成模型:逻辑回归与朴素贝叶斯

监督学习方法分为生成方法(generative approach)和判别方法(discriminativeapproach),所学到的模型分别为生成模型和判别模型。

3.1,生成模型:朴素贝叶斯

生成方法由数据学习联合概率分布P(X , Y),然后求出条件概率分布P(Y| X) 作为预测模型,即生成模型:

这样的方法之所以被称为生成方法,是因为模型表示了给定输入X产生输出Y的生成关系。典型的生成模型有:朴素贝叶斯和隐马尔科夫模型。

生成方法可以还原出联合概率分布P(X , Y) ,而判别方法则不能;生成方法的学习收敛速度更快,即当样本容量增加的时候,学到的模型可以更加收敛于真实模型;当存在隐变量时,仍可以用生成方法学习,此时判别方法就不能用。

3.2,判别模型:逻辑回归

判别方法由数据直接学习决策函数f(X)或者条件概率分布f(Y| X) 作为预测的模型,即判别模型,而无需学习联合概率分布P(X , Y),再间接学习决策函数f(X)或者条件概率分布f(Y| X) 作为预测。判别方法关心的是对给定的输入X,应该预测什么样的输出Y,典型的判别模型包括:k近邻法、感知机、决策树、逻辑斯谛回归、最大熵模型、支持向量机、提升方法和条件随机场等。

判别方法直接学习的是条件概率P(Y | X) 或决策函数f(X),直接面对预测,往往学习的准确率更高;由于直接学习P(Y| X) 或f(X),可以对数据进行各种程度上的抽象、定义特征并使用特征,因此可以简化学习问题。

4,逻辑回归与朴素贝叶斯的相似点:

一定条件下,逻辑回归模型与朴素贝叶斯分类器是等价的。

两者都利用了极大似然法进行参数估计,虽然似然函数的目标不同;逻辑回归和朴素贝叶斯分类器都是对特征的线性表达,虽然两者拟合的参数不同,前者是W和b后者是先验概率和似然;逻辑回归和朴素贝叶斯建模的都是条件概率(后者通过贝叶斯公式得到) ,对所最终求得的不同类的结果都有很好的解释性。而不像SVM,神经网络这样解释性不高。

5,code:

code:1,Logistic Regression、2,Softmax。

代码语言:javascript复制
# 1,Logistic Regression:
import numpy as np
import pandas as pd
from sklearn.linear_model import LogisticRegressionCV,LinearRegression
from sklearn.linear_model.coordinate_descent import ConvergenceWarning
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
import warnings
warnings.filterwarnings("ignore")  # 拦截异常

# 1.1,加载数据:
names = ['id','Clump Thickness','Uniformity of Cell Size','Uniformity of Cell Shape',
         'Marginal Adhesion','Single Epithelial Cell Size','Bare Nuclei',
        'Bland Chromatin','Normal Nucleoli','Mitoses','Class']

df = pd.read_csv('../DataSets/breast-cancer-wisconsin.data', header=None,names=names)

data = df.replace('?', np.nan).dropna(how = 'any') # 删除缺省的数据

X = data[names[1:10]]
Y = data[names[10]]

X_train,X_test,Y_train,Y_test = train_test_split(X,Y,test_size=0.1,random_state=0)

ss = StandardScaler()                # 数据归一化
X_train = ss.fit_transform(X_train)  # 训练模型及归一化数据

# 1.2,训练模型:
lr = LogisticRegressionCV(multi_class='ovr',fit_intercept=True, Cs=np.logspace(-2, 2, 20), cv=2, penalty='l2', solver='lbfgs', tol=0.01)
lr.fit(X_train, Y_train)

score = lr.score(X_train, Y_train)
print ('R_square:', score, 'n', lr.predict_proba(X_test))

# 预测:
X_test = ss.transform(X_test) # 使用模型进行归一化操作
Y_predict = lr.predict(X_test)
print(Y_predict)

# 1.3,模型持久化:
from sklearn.externals import joblib

joblib.dump(ss, "../OutPut/StandardScaler.model")              # 将标准化模型保存
joblib.dump(lr, "../OutPut/LogisticRegression.model")          # 将模型保存


re_ss = joblib.load("../OutPut/StandardScaler.model")            # 加载保存的模型
re_lr = joblib.load("../OutPut/LogisticRegression.model")
re_Y_predict = re_lr.predict(X_test)
print(re_Y_predict)

# 2,Softmax回归:多分类
import numpy as np
import pandas as pd
from sklearn.linear_model import LogisticRegressionCV
from sklearn.linear_model.coordinate_descent import ConvergenceWarning
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import label_binarize
from sklearn import metrics

# 2.1,加载数据:
df1 = pd.read_csv('../DataSets/winequality-red.csv', sep=";")
df1['type'] = 1 # 设置数据类型为红葡萄酒

df2 = pd.read_csv('../DataSets/winequality-white.csv', sep=";")
df2['type'] = 2 # 设置数据类型为白葡萄酒

df = pd.concat([df1,df2], axis=0)  # 合并上面两个数据

names = ["fixed acidity","volatile acidity","citric acid",    # 自变量
         "residual sugar","chlorides","free sulfur dioxide",
         "total sulfur dioxide","density","pH","sulphates",
         "alcohol", "type"]
quality = "quality"   # 因变量

new_df = df.replace('?', np.nan)
datas = new_df.dropna(how = 'any')  # 删除缺省值数据

X = datas[names]
Y = datas[quality]

X_train,X_test,Y_train,Y_test = train_test_split(X,Y,test_size=0.25,random_state=0)

ss = MinMaxScaler()
X_train = ss.fit_transform(X_train) ## 训练模型及归一化数据

# 2.2,训练模型:
lr = LogisticRegressionCV(fit_intercept=True, Cs=np.logspace(-5, 1, 100),multi_class='multinomial',
                                                                          penalty='l2', solver='lbfgs')
lr.fit(X_train, Y_train)

score = lr.score(X_train, Y_train)
print("R值:", score, 'n',"特征稀疏化比率:%.2f%%" % (np.mean(lr.coef_.ravel() == 0) * 100),'n',"参数:",lr.coef_,'n',"截距:",lr.intercept_)

# 2.3,预测:
X_test = ss.transform(X_test)    # 使用模型进行归一化操作
Y_predict = lr.predict(X_test)
print(Y_predict)

Reference:

《西瓜书》

《统计学习方法》

https://zhuanlan.zhihu.com/p/44591359

0 人点赞