0
点赞
收藏
分享

微信扫一扫

代码随想录算法训练营刷题复习5 : 贪心算法 1/2

草原小黄河 2024-06-24 阅读 29

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

任务描述

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

相关知识

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

逻辑回归算法

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

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

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

逻辑回归模型

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

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

代价函数

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

取似然函数为

对数似然函数为

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

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

梯度下降

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

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

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

sklearn库的使用

编程要求

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

测试说明

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

预期输出: 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.使用网格搜索进行寻找最佳超参数

模型参数与超参数

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

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

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

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

过拟合和欠拟合

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

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

解决方案:

提前停止训练:

正则化:

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

逻辑回归网格搜索

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

编程要求

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

测试说明

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

预期输出: 测试通过

第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("测试失败")
举报

相关推荐

0 条评论