目录
sklearn.linear_model.LogisticRegression 代码分析
工大菜凯,希望通过做笔记记录自己学的知识,也希望能帮助到同样在入门的同学 ❥侵权立删~
逻辑斯谛回归模型基本知识点
- 最大熵是概率模型学习的一个准则,将其推广到分类问题得到最大熵模型
- 逻辑斯谛回归模型与最大熵模型都属于对数线性模型
- 逻辑斯谛回归模型与最大熵模型一般采用极大似然估计或正则化的极大似然估计,可以形式化为无约束最优化问题,求解最优化问题的算法有改进的迭代尺度法、梯度下降法、拟牛顿法
逻辑斯谛回归(Logistic Regression)
逻辑斯谛分布
- 分布函数图形是一条S形曲线,该曲线以点(,)为中心对称,满足下面式子
- 逻辑斯谛回归分布函数曲线在中心附近增长的较快,在两端增长速度较慢,形状参数的值越小,曲线在中心附近增长的越快
二项逻辑斯谛回归模型
- 一种分类模型,由条件概率分布P(Y|X)表示,形式为参数化的逻辑斯谛分布
- 二类分类 Y的取值为0 1
- 比较 P(Y=1|X)和P(Y=0|X)的大小,将实例X分到概率值较大的那一类
逻辑斯谛回归模型的特点
- 一个事件的几率(odds):是指该事件发生的概率与该事件不发生的概率的比值
- 线性函数越接近正无穷, P(Y=1|X)的概率值就越接近1
- 线性函数越接近负无穷, P(Y=1|X)的概率值就越接近0
- 此结论正好和逻辑斯谛回归模型的分布函数对应,称这样的模型为逻辑斯谛回归模型
模型参数估计
- 逻辑斯谛回归模型在学习的过程中,我们可以通过应用极大似然估计模型,从而得到逻辑回归模型
- 对L() 求极大值,得到的估计值
多项式逻辑斯谛回归
最大熵模型
最大熵原理
- 最大熵原理认为:学习概率模型时,在所有可能的概率模型(分布)中,熵最大的模型时最好的模型
- 通常用约束条件来确定概率模型的集合,所以最大熵原理也可以表述为满足约束条件的模型集合中选取熵最大的模型
最大熵原理例子
最大熵模型的定义
- 最大熵原理是统计学习的一般原理,将它应用到分类 得到最大熵模型
- 我们将和作为模型学习的约束条件
最大熵模型
最大熵模型的学习
-
最大熵模型的学习等价于最优化问题
最大熵模型学习的例子
极大似然估计
- 这样,最大熵模型的学习问题就转换为具体求解对数似然函数极大化或对偶函数极大化的问题
模型学习的最优化算法
改进的迭代尺度法(IIS)
- IIS是一种最大熵模型学习的最优化算法,目标是通过极大似然估计学习模型参数,即求对数似然函数的极大值
- 这就给出了一种求的最优解的迭代算法,即改进的迭代尺度算法IIS
拟牛顿法(BFGS算法)
逻辑斯谛回归代码分析
from math import exp
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
# data 训练数据集的生成
def create_data():
iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['label'] = iris.target
df.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'label']
data = np.array(df.iloc[:100, [0,1,-1]])
# print(data)
return data[:,:2], data[:,-1]
# X是样本的特征数据 y是样本的目标标签
X, y = create_data()
# 将整个训练数据集分成70% 训练数据 和 30%测试数据
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
class LogisticReressionClassifier:
def __init__(self, max_iter=200, learning_rate=0.01):
self.max_iter = max_iter
self.learning_rate = learning_rate
def sigmoid(self, x):
return 1 / (1 + exp(-x))
# 将输入数据集X转换为矩阵形式的数据,其中每个数据项前面添加一个额外的元素1.0
# *是Python中的可变参数语法,表示将一个可迭代对象展开成多个独立的元素
# 举个例子,如果d的值是[2, 3],那么data_mat.append([1.0, *d])
# 就相当data_mat.append([1.0, 2, 3])
def data_matrix(self, X):
data_mat = []
for d in X:
data_mat.append([1.0, *d])
return data_mat
# 接受数据集X和对应的标签y作为输入
def fit(self, X, y):
# 将数据集X转换成矩阵形式的数据data_mat
data_mat = self.data_matrix(X) # m*n
# len(data_mat[0])表示数据集第一个样本的特征个数 也就是数据集的列数
# 创建一个行数=数据集列数 列数为1 的全零数组
# 全零数组的目的就是初始化模型的权重参数,并在训练过程中逐步更新这些参数
self.weights = np.zeros((len(data_mat[0]),1), dtype=np.float32)
# 外层循环iter_控制迭代次数,内层循环i遍及数据集中的每个样本
for iter_ in range(self.max_iter):
for i in range(len(X)):
# 将回归模型对样本的预测结果保存在result变量中
result = self.sigmoid(np.dot(data_mat[i], self.weights))
# 计算预测结果与真实标签之间的误差
error = y[i] - result
# 更新权重参数 np.transpose 转置 将原本的行向量转为列向量 便于后续的矩阵计算
self.weights += self.learning_rate * error * np.transpose([data_mat[i]])
# 输出学习率和最大迭代次数
print('LogisticRegression Model(learning_rate={},max_iter={})'.format(self.learning_rate, self.max_iter))
# 评估模型在测试集上的准确率
def score(self, X_test, y_test):
right = 0
X_test = self.data_matrix(X_test)
# zip 的作用是 将x_test 和对应的标签y_text进行打包,以便同时遍历它们的元素
for x, y in zip(X_test, y_test):
# 一般情况下逻辑回归模型的预测结果可以通过线性函数和sigmoid函数组合得到
# 这里直接使用线性函数的结果作为预测值,是因为这里只关注预测结果的正负性
# 如果希望在预测结果上应用sigmoid函数并得到概率值
# result = self.sigmoid(np.dot(data_mat[i], self.weights))
# 这样预测结果经过sigmoid函数处理,将其映射到(0,1)的概率范围内
result = np.dot(x, self.weights)
if (result > 0 and y == 1) or (result < 0 and y == 0):
right += 1
return right / len(X_test)
# 训练逻辑回归模型
lr_clf = LogisticReressionClassifier()
lr_clf.fit(X_train, y_train)
x_ponits = np.arange(4, 8)
# w0 + w1*X1 + w2*X2 = 0 得X2=-(w0+w1*x1)/w2 x2为数据集的第二个特征的值,这里把它看作了y来处理
y_ = -(lr_clf.weights[1]*x_ponits + lr_clf.weights[0])/lr_clf.weights[2]
# 画出可以区分 类别0 的特征(x1,x2) 和类别1 的特征(x1,x2)的分割线
plt.plot(x_ponits, y_)
#lr_clf.show_graph()
# 特征(x1,x2)的分布情况
plt.scatter(X[:50,0],X[:50,1], label='0')
plt.scatter(X[50:,0],X[50:,1], label='1')
plt.legend()
sklearn.linear_model.LogisticRegression 代码分析
from sklearn.linear_model import LogisticRegression
clf = LogisticRegression(max_iter=200)
clf.fit(X_train, y_train)
clf.score(X_test, y_test)
# clf.coef_ :训练得到每个特征所对应的权重系数 如果训练集有n个特征则clf.coef_返回的是(1,n)的数组
# clf.intercept_ :逻辑回归模型的截距
# clf.intercept :在二元逻辑回归模型中,clf.intercept_ 是一个标量,表示决策边界与 y 轴的交点
# clf.intercept_ 是一个形状为 (k, ) 的向量
print(clf.coef_, clf.intercept_)
x_ponits = np.arange(4, 8)
y_ = -(clf.coef_[0][0]*x_ponits + clf.intercept_)/clf.coef_[0][1]
plt.plot(x_ponits, y_)
plt.plot(X[:50, 0], X[:50, 1], 'o', color='blue', label='0')
plt.plot(X[50:, 0], X[50:, 1], 'o', color='orange', label='1')
plt.xlabel('sepal length')
plt.ylabel('sepal width')
plt.legend()