头歌——机器学习——逻辑回归如何实现分类

 

第1关:逻辑回归如何实现分类

任务描述

本关任务:编写一个使用逻辑回归实现分类的程序

相关知识

为了完成本关任务,你需要掌握:1.逻辑回归基本原理。2.适用sklearn进行逻辑回归分类。

逻辑回归算法

一般来说逻辑回归用于处理二元分类问题,即 y⊂0,1

当样本中有多个类别时 y⊂0,1,2,...,n

Logistic Regression和Linear Regression的原理是相似的,可以简单的描述为这样的过程:

1,找一个合适的预测函数,一般表示为h函数,该函数就是我们需要找的分类函数,它用来预测输入数据的判断结果。 这个过程时非常关键的,需要对数据有一定的了解或分析,知道或者猜测预测函数的“大概”形式,比如是线性函数还是非线性函数。

2,构造一个Cost函数(损失函数),该函数表示预测的输出(h)与训练数据类别(y)之间的偏差,可以是二者之间的差(h-y)或者是其他的形式。 综合考虑所有训练数据的“损失”,将Cost求和或者求平均,记为J(θ)函数,表示所有训练数据预测值与实际类别的偏差。

3,显然,J(θ)函数的值越小表示预测函数越准确(即h函数越准确),所以这一步需要做的是找到J(θ)函数的最小值。 找函数的最小值有不同的方法,Logistic Regression实现时有的是梯度下降法(Gradient Descent)。

逻辑回归模型

预测函数 Logistic Regression虽然名字里带“回归”,但是它实际上是一种分类方法,用于两分类问题(即输出只有两种)。根据上述步骤的说明,需要先找到一个预测函数(h),显然,该函数的输出必须是两个值(分别代表两个类别),所以利用了Logistic函数(或称为Sigmoid函数),函数形式为

h(x)=1+e−θTx1​

hθ(x)函数的值有特殊的含义,他表示结果取1的概率,听此对于输入x分类结果类别为1和类别0的概率分布为

P(y=1∣x;θ)=hθ​(x) P(y=0∣x;θ)=1−hθ​(x)

代价函数

J=−m1​i=1∑m​y(i)log(h(xi))+(1−y(i))log(1−h(x(i)))

这里的J(θ)是基于最大似然估计推导得到的

P(y∣x;θ)=(hθ​(x))y(1−ht​heta(x))1−y

取似然函数为

L(θ)=i=1∏m​P(y(i)∣x(i);θ)=i=1∏m​(hθ​(x(i)))y(i)(1−hθ​(x(i)))1−y(i)

对数似然函数为

l(θ)=logL(θ)=i=1∑m​(y(i)loghθ​(x(i))+(1−y(i)log(1−hθ​(x(i))))

最大似然估计就是要求使J(θ)取最大值时的θ,其实这里可以使用梯度上升法求解,求得的θ就是要求你的最佳参数。

J(θ)=−m1​l(θ)

因为乘了个负的系数m1​,所以J(θ)取最小值时的θ为要求的最佳参数。

梯度下降

求J(θ)的最小值可以使用梯度下降法,根据梯度下降法可得θ的更新过程:

θj​:=θj​−α∗m1​∗i=1∑m​(h(x)−y)xj(i)​ 其中α为学习率

逻辑回归在形式上更新参数与线性回归相同,实则不同。 在线性回归中,h(x)是一个线性函数,而在逻辑回归中,h(x)是一个sigmoid函数

sklearn库的使用

  • # 使用sklearn中的make_classification函数构建二分类的数据
  • # 其中n_samples=100是样本的数量,n_classes是样本的种类
  • x, y = make_classification(n_samples=100, n_classes=2)
  • # 从sklearn中导入逻辑回归分类器
  • from sklearn.linear_model import LogisticRegressionCV
  • # 实例化一个逻辑回归分类器,使用默认参数
  • logistic = LogisticRegressionCV()
  • # 传入数据进行模型训练
  • logistic.fit(x, y)
  • # 传入数据进行模型评估
  • logistic.score(x, y)

编程要求

根据提示,在右侧编辑器补充代码,完善代码,

测试说明

平台会对你编写的代码进行测试:

预期输出: 0.9

第1关任务——代码题

from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
import numpy as np

np.random.seed(10)

if __name__ == '__main__':
    # ********** Begin ********** #
    # 使用sklearn中的make_classification函数构建二分类的数据,样本数量为100
    X, y = make_classification(n_samples=100, n_features=20, n_informative=2, n_redundant=10, random_state=42, flip_y=0.1)

    # 将数据集拆分成测试集与训练集,训练集占所有数据的80%
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

    # 进行模型训练并评估模型
    model = LogisticRegression(max_iter=1000, random_state=42)
    model.fit(X_train, y_train)

    # 预测测试集结果
    y_pred = model.predict(X_test)

    # 评估模型的准确率
    accuracy = accuracy_score(y_test, y_pred)
    print(round(accuracy, 1))
    # ********** End ********** #

 

第2关:超参数

任务描述

本关任务:编写一个使用网格搜索进行最佳参数寻找的程序

相关知识

为了完成本关任务,你需要掌握:1.模型欠拟合和过拟合的解决方案。2.使用网格搜索进行寻找最佳超参数

模型参数与超参数

模型参数 简单来说,模型参数就是模型内部可以通过计算的到的,例如线性回归中的的系数

通常,我们要获取最好的模型参数是由一些优化算法来获取的

模型超参数 而模型超参数是模型外部就已经确定了值,在模型内部无法进行修改的,例如线性回归中梯度下降中使用的学习速率

对于指定的问题,一般我们是无法知道最好的模型超参数的,只能由平常设置参数的经验或者反复去实验寻找超参数

过拟合和欠拟合

欠拟合 对于给定的数据集,欠拟合的成因大多是模型不够复杂、拟合函数能力不够,为此,可以增加迭代次数继续训练、尝试更换其他算法、增加模型的参数数量和复杂程度,或者采用集成方法

过拟合 过拟合成因是给定的数据集相对过于简单,使得模型在拟合函数时过分的考虑了噪声等不必要的数据间的关联。或者说相对于给定数据集,模型过于复杂、拟合能力过强

解决方案:

提前停止训练:

减少训练的迭代次数,理论上来说,可以找到一个训练程度,使得验证集误差率最低,视为拟合效果最好的点

正则化:

L0正则化

损失函数后面加入L0范数λ||w||0,也就是权向量中非零参数的个数 他的特点是可以实现参数的稀疏性,是尽可能多的参数值为0,这与稀疏编码的思想温和,但是缺点在于优化比较困难,因此实际更常用的是L1范数

L1正则化

损失函数L0后面加上参数(权向量w)的L1范数项:λ||w||1=λ∑ni=1||wi||1,其中 n 是权向量 w 的长度(参数数量),λ 是正则化参数,用来调和L0 与正则项 L1正则项等价于先验概率服从拉普拉斯分布;L1范数是L0范数的最优凸近似,比L0范数容易优化,而且也可以很好地实现参数稀疏性,常别称作“稀疏规则算子”,因此相对L0正则化更常用。同时L1和L0因为具有使参数稀疏的特点,常用于特征选择。

L2正则化

损失函数L0后面加上参数L2范数的平方项:λ2n||w||22=λ2n∑ni=1w2i  ,其大小由参数weight-decay(权值衰减)调节 其中分母有无n均可,L2正则项等价于先验概率服从高斯分布;与L0,L1不同的是,L2很难使某些参数达到0,它只能使参数接近0。如今在许多问题中,更常用L2正则是因为:一方面我们通常想考虑更多的参数对问题的影响(因此不能让参数稀疏),另一方面在优化时,L2范数有利于解决condition number: k(A)=||A||||A−1||  太大(远大于1)的情况下(此时存在某些参数,对结果有过大的影响)矩阵求逆很困难的问题,这使得优化求解变得更快更稳定。

上述解决模型过拟合和欠拟合问题的方式中,涉及到一些超参数 在sklearn中,可以使用网格搜索的方式寻找最佳的参数

逻辑回归网格搜索

在sklearn中,GridSearchCv 用来生成超参数的组合,自动选择效果最好的参数。 sklearn.linear_model.LogisticRegressionCV(*, Cs=10, fit_intercept=True,penalty='l2', tol=0.0001, max_iter=100)

cs:cs中的每个值都描述了正则强度的倒数,较小的值指定更强的正则化 fit_intercept:指定是否将常量添加到决策函数 penalty:使用的正则化规范,默认值为"l2" tol:停止训练的标准 max_iter:优化算法最大迭代次数

  • from sklearn.linear_model import LogisticRegressionCV
  • logistic = LogisticRegressionCV()
  • from sklearn.model_selection import GridSearchCV
  • # param说明
  • # {参数名1:[参数值1, 参数值2],...}
  • param = {
  • 'penalty':["l1", "l2"],
  • 'c':[1, 10]
  • }
  • # 参数说明:
  • # logistic 逻辑回归分类器
  • # param_dict 超参字典
  • model = GridSearchCV(logistic, param_dict=param)
  • # 使用网格搜索进行模型训练找出最佳参数
  • model.fit(x, y)

编程要求

根据提示,在右侧编辑器补充代码,完善代码,使得代码能够通过测试

测试说明

平台会对你编写的代码进行测试:

预期输出: 测试通过

第2关任务——代码题

from sklearn.linear_model import LogisticRegressionCV
from sklearn.model_selection import GridSearchCV,train_test_split
from sklearn.datasets import load_iris


def model_train(x_train, x_test, y_train, y_test):
    # ********** Begin ********** #
    # 设置param进行网格搜索参数设置
    param_dict = {'Cs': [0.1, 1, 10], 'penalty': ['l1', 'l2']}
    # {参数名1:[参数值1, 参数值2],...}
    # 参数说明:
    # logistic 逻辑回归分类器
    logistic = LogisticRegressionCV(cv=5)
    # param_dict 超参字典
    # 使用网格搜索进行模型训练找出最佳参数
    grid_search = GridSearchCV(logistic, param_grid=param_dict, cv=5)
    grid_search.fit(x_train, y_train)
    # 计算模型在测试集上的准确率
    score = grid_search.score(x_test, y_test)
    # ********* End ********** #
    return score

if __name__ == '__main__':
    iris = load_iris()
    x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2)
    score = model_train(x_train, x_test, y_train, y_test)
    if score >= 0.8:
        print("测试通过")
    else:
        print("测试失败")

 

 

<think>好的,我现在需要帮助用户解决如何使用逻辑回归对具有四个属性的数据进行分类的问题。首先,我得回忆一下逻辑回归的基本概念和步骤。根据用户提供的引用内容,逻辑回归主要用于分类任务,特别是二分类,但也可以通过一些方法扩展到多分类问题,比如One-Vs-All、One-Vs-One或者Softmax回归。用户的数据有四个特征,所以需要基于这四个特征构建模型。 首先,我应该考虑数据预处理。用户的数据可能有四个属性,需要检查是否存在缺失值、是否需要标准化或归一化。例如,引用[2]中提到使用LogisticRegression实现鸢尾花分类时,可能需要处理特征。然后,特征工程也很重要,可能需要添加多项式特征或进行特征选择,引用[3]提到特征选择与正则化是进阶应用的一部分。 接下来是模型构建。逻辑回归虽然名字里有回归,但实际用于分类,通过sigmoid函数将线性组合映射到概率。对于多分类问题,用户需要确定是二分类还是多分类。如果是多分类,可以用OvA、OvO或Softmax。引用[3]详细说明了这些方法,所以需要根据具体情况选择。 然后,损失函数的选择。逻辑回归使用交叉熵损失函数而不是均方误差,这一点在引用[2]和[3]都有提到。梯度下降算法用于优化参数,这里可能需要解释计算图的概念,如引用[1]中提到的计算图角度理解梯度下降。 模型训练部分,需要拆分数据集为训练集和测试集,可能还要用交叉验证。训练完成后评估指标如准确率、混淆矩阵等,引用[2]中的鸢尾花例子可能用到了这些指标。 最后,优化与调参,包括正则化(L1/L2)防止过拟合,调整学习率等超参数。引用[3]提到了正则化,所以应该包含这部分内容。 现在需要确保步骤清晰,按照预处理、模型构建、训练、评估、优化的顺序。同时注意使用正确的中文术语,并引用相关文献。例如,在提到损失函数时引用[2]和[3],在提到多分类方法时引用[3]。 可能用户的应用场景类似鸢尾花分类,所以可以类比那个例子。代码示例部分,引用[2]中的Python代码可以参考,使用scikit-learn的LogisticRegression,并添加四个特征的示例。需要确保代码正确,包括数据加载、预处理、模型训练和评估的步骤。 最后生成相关问题,可能涉及逻辑回归的损失函数、多分类处理、特征选择等,引用之前的引用内容来形成问题。</think>### 逻辑回归实现四特征分类任务步骤 #### 1. 数据预处理 - **数据清洗**:检查缺失值并处理(删除/填充) - **标准化**:对四个特征进行标准化处理(如Z-score标准化) $$x_{\text{标准化}} = \frac{x - \mu}{\sigma}$$ 其中$\mu$为均值,$\sigma$为标准差[^2] - **数据分割**:按7:3划分训练集和测试集 #### 2. 模型构建 **逻辑回归原理**: $$p(y=1|\mathbf{x}) = \frac{1}{1 + e^{-(\beta_0 + \beta_1x_1 + \beta_2x_2 + \beta_3x_3 + \beta_4x_4)}}$$ 其中四个特征对应$x_1$到$x_4$,$\beta$为待求参数[^1] #### 3. 特征工程(可选) - **多项式扩展**:添加特征交叉项(如$x_1x_2$) - **特征选择**:使用L1正则化筛选重要特征[^3] #### 4. 模型训练 ```python from sklearn.linear_model import LogisticRegression import pandas as pd # 加载数据(假设数据文件为data.csv) data = pd.read_csv('data.csv') X = data[['feat1','feat2','feat3','feat4']] # 四个特征列 y = data['label'] # 目标列 # 创建逻辑回归模型(多分类自动使用Softmax) model = LogisticRegression(multi_class='multinomial', solver='lbfgs') model.fit(X, y) # 评估准确率 print(f"测试集准确率: {model.score(X_test, y_test):.2f}") ``` #### 5. 模型优化 - **正则化**:添加L2正则化控制过拟合 ```python model = LogisticRegression(penalty='l2', C=0.1) # C为正则化强度倒数 ``` - **超参数调优**:使用网格搜索优化学习率、正则化参数等 #### 6. 结果解释 - **系数分析**:查看特征权重 ```python print("特征权重:", model.coef_) # 输出四个特征对应系数 ``` - **决策边界可视化**:通过PCA降维后绘制分类区域
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花来❀勿Q

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值