一、线性模型与回归
回归与分类有什么区别?
回归:预测一个连续的数值,房价预测。分类:将实例分配到预定的类别,如猫狗分类。最主要区别至于回归输出的是一个连续的数值,分类输出的是类别标签,通常离散的集合。
线性模型
线性模型的一般形式:
其中x=(x1+x2+...xn)是n维属性描述的样本,xi是x在第i个属性上的取值。
向量形式:,其中w=(w1+w2+...wn)
线性回归的目的:学习一个线性模型以尽可能准确地预测实值输出标记 f(x)=wxi+b 使得。
二、最小二乘与参数求解
最小二乘法(least square method):考虑xi是一维数据,设其回归值f(x_i)与实际观察 y_i 之间存在的误差 e_i,则学习的目标为:(w∗,b∗)=argmin Σ e_i^2
最小化均方误差:
分别对w和b求导,可得:
三、对数线性回归
如何通过线性模型预测非线性复杂的函数呢?线性回归模型可以推广为y=g(f(x))=g(wx+b)。
比如:,
,对y取对数可得:
四、logistic回归推导
Logistic回归是一种广泛应用于二分类问题的统计学习方法,其核心思想是通过构建一个线性模型,采用sigmoid函数将连续的预测值转化为概率值,从而将预测结果转化为二分类标签。
1. 假设函数
首先,我们假设输入数据x通过一组参数θ线性变换得到预测值z,即:
2.Sigmoid函数
为了将预测值转化为概率值,我们需要使用sigmoid函数,其公式如下:
sigmoid函数是一个S形函数,取值范围在[0,1]之间,当z趋于无穷大时h(z)趋近于1,当z趋于负无穷大时h(z)趋近于0。
3.损失函数
为了衡量预测值h(z)与实际标签y之间的差距,我们可以采用交叉熵损失函数,其公式如下:
其中m为样本数量,为第i个样本的标签,
为第i个样本的预测结果。
4.参数估计
我们的目标是最小化损失函数 J(θ),通过梯度下降法来求解最优参数。具体来说,我们需要对损失函数关于参数 的偏导数进行求解,即:
其中表示第i个样本中第j个特征的取值。
5.梯度下降
使用梯度下降法来更新参数:
表示学习率
6.数据分类
原始数据:
分类后:
五、代码实现
使用了Scikit-learn库中自带的鸢尾花数据集,该数据集包含了150个样本,每个样本有四个特征(花萼长度、花萼宽度、花瓣长度、花瓣宽度)和一个目标变量(鸢尾花的种类)实现逻辑回归。
1.数据集准备
可以通过下面代码查看数据集
from sklearn.datasets import load_iris
# 加载鸢尾花数据集
iris = load_iris()
# 输出数据集的描述信息
print(iris.DESCR)
# 查看特征矩阵
print('特征矩阵:')
print(iris.data[:5]) # 输出前5个样本的特征
# 查看类别标签
print('类别标签:')
print(iris.target[:5]) # 输出前5个样本的类别标签
print(iris.target_names) # 输出类别标签的名称
2.数据集处理:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# 加载鸢尾花数据集
iris = load_iris()
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
3.特征处理
# 提取特征和目标变量
X = iris.data
y = iris.target
# 标准化特征
scaler = StandardScaler()
X = scaler.fit_transform(X)
4.模型训练
# 创建Logistic回归模型并拟合数据
model = LogisticRegression()
model.fit(X_train, y_train)
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# 加载鸢尾花数据集
iris = load_iris()
# 提取特征和目标变量
X = iris.data[:, :2]
y = iris.target
# 标准化特征
scaler = StandardScaler()
X = scaler.fit_transform(X)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
# 创建Logistic回归模型并拟合数据
model = LogisticRegression()
model.fit(X_train, y_train)
# 可视化决策边界
x_min, x_max = X[:, 0].min() - 0.5, X[:, 0].max() + 0.5
y_min, y_max = X[:, 1].min() - 0.5, X[:, 1].max() + 0.5
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02),
np.arange(y_min, y_max, 0.02))
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.figure(1, figsize=(6, 4))
plt.pcolormesh(xx, yy, Z, cmap=plt.cm.Paired)
# 将训练集和测试集可视化
plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, edgecolors='k', cmap=plt.cm.Paired)
plt.scatter(X_test[:, 0], X_test[:, 1], c=y_test, edgecolors='k', cmap=plt.cm.Paired, alpha=0.8)
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.xticks(())
plt.yticks(())
plt.show()
5.预测准确率
accuracy = model.score(X_test, y_test)
print('Accuracy:', accuracy)
Accuracy: 0.8888888888888888
完整代码:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# 加载鸢尾花数据集
iris = load_iris()
# 提取特征和目标变量
X = iris.data[:, :2]
y = iris.target
# 标准化特征
scaler = StandardScaler()
X = scaler.fit_transform(X)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
# 创建Logistic回归模型并拟合数据
model = LogisticRegression()
model.fit(X_train, y_train)
# 计算模型在测试集上的准确率
accuracy = model.score(X_test, y_test)
print('Accuracy:', accuracy)
# 可视化决策边界
x_min, x_max = X[:, 0].min() - 0.5, X[:, 0].max() + 0.5
y_min, y_max = X[:, 1].min() - 0.5, X[:, 1].max() + 0.5
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02),
np.arange(y_min, y_max, 0.02))
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.figure(1, figsize=(6, 4))
plt.pcolormesh(xx, yy, Z, cmap=plt.cm.Paired)
# 将训练集和测试集可视化
plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, edgecolors='k', cmap=plt.cm.Paired)
plt.scatter(X_test[:, 0], X_test[:, 1], c=y_test, edgecolors='k', cmap=plt.cm.Paired, alpha=0.8)
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.xticks(())
plt.yticks(())
plt.show()
六、总结
在训练Logistic回归模型时,通常采用最大似然估计方法,即选择参数使得给定数据集下模型预测正确的概率最大化。为了防止过拟合,可以添加正则项(L1或L2正则化)来控制参数的大小。
Logistic回归的优点包括:
- 计算效率高,适用于大规模数据集。
- 可以得到分类结果的概率。
- 可以使用正则项防止过拟合。
- 可以处理离散型特征。
然而,Logistic回归也有一些限制和缺点:
- 无法处理非线性关系。
- 对于多分类问题,需要进行扩展,例如使用一对多方法。
- 对于不平衡数据集,容易受到少数类样本的影响。
- 需要仔细选择特征,过多或过少的特征都可能导致效果不佳。