机器学习logistic回归实战

一、线性模型与回归

回归与分类有什么区别?

        回归:预测一个连续的数值,房价预测。分类:将实例分配到预定的类别,如猫狗分类。最主要区别至于回归输出的是一个连续的数值,分类输出的是类别标签,通常离散的集合。

 线性模型

         线性模型的一般形式:f(x)=w1*1+w2*2+...Wn*n+b

  其中x=(x1+x2+...xn)是n维属性描述的样本,xi是x在第i个属性上的取值。

        向量形式:f(x)=w_nx+b,其中w=(w1+w2+...wn)

                 

       线性回归的目的:学习一个线性模型以尽可能准确地预测实值输出标记 f(x)=wxi+b 使得f(x_i)=y_i

二、最小二乘与参数求解

       最小二乘法(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)。

比如:g(x)=e_{}^{x},y=e^{wx+b},对y取对数可得:lny=wx+b

             

四、logistic回归推导

        Logistic回归是一种广泛应用于二分类问题的统计学习方法,其核心思想是通过构建一个线性模型,采用sigmoid函数将连续的预测值转化为概率值,从而将预测结果转化为二分类标签。

       1.  假设函数

首先,我们假设输入数据x通过一组参数θ线性变换得到预测值z,即:z=\theta ^{T}x

      2.Sigmoid函数

为了将预测值转化为概率值,我们需要使用sigmoid函数,其公式如下:​ h(z)=\frac{1}{1+e^{-z}}

sigmoid函数是一个S形函数,取值范围在[0,1]之间,当z趋于无穷大时h(z)趋近于1,当z趋于负无穷大时h(z)趋近于0。

       3.损失函数

为了衡量预测值h(z)与实际标签y之间的差距,我们可以采用交叉熵损失函数,其公式如下:

           

其中m为样本数量,y^{(i)}为第i个样本的标签,h(z^{(i)})为第i个样本的预测结果。

       4.参数估计

我们的目标是最小化损失函数 J(θ),通过梯度下降法来求解最优参数。具体来说,我们需要对损失函数关于参数 \theta _{j}^{}的偏导数进行求解,即:

                              

其中x_{j}^{(i)}表示第i个样本中第j个特征的取值。

        5.梯度下降

使用梯度下降法来更新参数\theta _{j}

                                    

\alpha表示学习率

        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回归也有一些限制和缺点:

  • 无法处理非线性关系。
  • 对于多分类问题,需要进行扩展,例如使用一对多方法。
  • 对于不平衡数据集,容易受到少数类样本的影响。
  • 需要仔细选择特征,过多或过少的特征都可能导致效果不佳。
  • 20
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值