零基础实战机器学习
黄佳
新加坡科研局首席研究员
19489 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 24 讲
零基础实战机器学习
15
15
1.0x
00:00/00:00
登录|注册

04| 实战5步(下):怎么建立估计10万+软文点击率的模型?

你好,我是黄佳。欢迎来到零基础实战机器学习。
上一讲,我们通过一个项目讲解了“实战 5 步”的前两步。在第一步“定义问题”中,我们定义了要处理的问题,也就是根据点赞数和转发数等指标,估计一篇文章能实现多大的浏览量。同时我们还将它归类为回归问题;在第二步“收集数据和预处理”中,我们做好了数据的预处理工作,还把数据集拆分成了这四个数据集:
特征训练集(X_train)
特征测试集(X_test)
标签训练集(y_train)
标签测试集(y_test)
有了这些数据集后,我们就可以开始考虑选什么算法,然后建立模型了。所以,今天这节课我们继续完成“实战 5 步”中的后三步:选择算法并建立模型、训练拟合模型和评估并优化模型性能,来把这个项目做完。下面,我们先看看怎么选择算法并建立模型。

第 3 步 选择算法并建立模型

在这一步中,我们需要先根据特征和标签之间的关系,选出一个合适的算法,并找到与之对应的合适的算法包,然后通过调用这个算法包来建立模型。
选算法的过程很考验数据科学家们的经验,不过,你也无需担心自己没有经验,在这个课程中,我会给你讲清楚每一个实战中所用的算法的原理,帮助你建立起选算法的直觉。
具体到我们这个项目里,在上一讲中我说过,我们这个数据集里的某些特征和标签之间,存在着近似线性的关系。而且,这个数据集的标签是连续变量,因此,适合用回归分析来寻找从特征到标签的预测函数。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了建立估计软文点击率的机器学习模型的实战步骤。作者首先讲解了选择算法并建立模型的步骤,指出了回归分析的重要性,并选择了线性回归算法来建模。接着介绍了使用scikit-learn工具包中的LinearRegression算法包来建立模型的方法。作者还解释了模型的内部参数和外部参数,并指出对于简单模型来说,默认的外部参数设置通常是不错的选择。最后,作者强调了训练拟合机器学习模型的重要性。整篇文章以简洁清晰的语言介绍了建立模型的关键步骤,适合读者快速了解机器学习模型建立的基本流程。文章通过讲解训练模型的步骤,强调了fit方法的重要性,以及模型优化的过程,包括损失函数、梯度下降等概念。通过简洁的语言和图示,读者能够快速了解模型训练的关键环节,为进一步学习和实践提供了基础知识。文章还提到了模型的评估和优化过程,包括使用$R^{2}$和MSE指标进行模型效果评估,以及调整模型的外部参数和选择合适的算法来优化模型。整体而言,本文为读者提供了一次完整的机器学习实战经历,并引导他们进一步加深对数据和机器学习概念的理解,挖掘出数据中的价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《零基础实战机器学习》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(21)

  • 最新
  • 精选
  • 茜茜
    置顶
    黄老师,我有一个问题,在使用GridSearchCV前,需要划分训练集和测试集吗?按照什么比例划分呢?谢谢

    作者回复: 看到你的答案里面已经用了GridSearchCV。很好,GridSearchCV,默认已经使用了5折交叉验证,就是其中的CV参数。那么我们原来不是说3个集吗,训练集,验证集,测试集。因为GridSearchCV有已经自带交叉验证的存在。就不再需要验证集了。 而测试集,还需要,目的是把GridSearchCV的交叉验证结果拿到测试集做最后测试。 好问题。谢谢。

    2021-09-06
    4
    7
  • 茜茜
    置顶
    在方法2我使用了网格搜索自动调参,可以获得更好的预测评分。 # 思考题; from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.model_selection import GridSearchCV import pandas as pd import chardet import itertools #查询编码格式 with open('易速鲜花微信软文.csv', 'rb') as f: enc = chardet.detect(f.read()) # or readline if the file is large #读取数据 df_ads = pd.read_csv('易速鲜花微信软文.csv', encoding = enc['encoding']) # 判断空值 df_ads.isna().sum() # 删掉含空值的行 df_ads = df_ads.dropna() # 构建特征集和标签集 x = df_ads.drop(['浏览量'], axis = 1) y = df_ads['浏览量'] # 拆分训练集(80%)和测试集(20%) xtrain, xtest, ytrain, ytest = train_test_split(x, y, test_size = 0.2, random_state = 0) # 调参:方法一 fit_intercept_list = [True, False] normalize_list = [True, False] print('方法1') for item in itertools.product(fit_intercept_list, fit_intercept_list): fit_intercept = item[0] normalize = item[1] # 训练模型 linereg_model = LinearRegression(fit_intercept = fit_intercept, normalize = normalize) linereg_model.fit(xtrain, ytrain) # 预测测试集对的y值 y_pred = linereg_model.predict(xtest) # 给出模型评分(使用验证集) print(f'参数组合; fit_intercept = {fit_intercept},normalize = {normalize}','线性回归预测评分:', linereg_model.score(xtest, ytest)) # 调参:方法2 model = LinearRegression() # 建立需要搜索的参数的范围 param ={'fit_intercept':[True, False],'normalize': [True, False]} # 初始化网格搜索的方法 grid = GridSearchCV(model,param) #用网格搜索方法进行拟合数据 grid.fit(x, y) # 输出最优的参数组合 print('方法2') print('最佳模型的参数组合:', grid.best_params_) print('样本得分平均值:',grid.best_score_) print('最佳模型测预测评分:',grid.score(xtest, ytest)) #结论: #1. 最佳参数组合是:{'fit_intercept': True, 'normalize': True} 或 {'fit_intercept': True, 'normalize': False} #2. 方法2 的预测评分:0.75 高于方法1的预测评分:0.74

    作者回复: 十分认真!

    2021-09-06
    4
    13
  • 在路上
    置顶
    佳哥好,这节课的示例在我的电脑上运行会报错:Glyph 28909 missing from current font. font.set_text(s, 0.0, flags=flags),原因是中文字体乱码,解决方法是设置一个本地有的中文字体,可以先打印下本地支持的字体,方法如下,在`import matplotlib.pyplot as plt`这条语句所在的单元格插入代码: ``` from matplotlib import font_manager for font in font_manager.fontManager.ttflist: # 查看字体名以及对应的字体文件名 print(font.name, '-', font.fname) # 我使用了微软雅黑 plt.rcParams['font.sans-serif']='Microsoft YaHei' ``` 调整参数后的测试结果是: LinearRegression(normalize = True, fit_intercept= False) 线性回归预测集评分: 0.689427235535854 线性回归训练集评分: 0.6947857687516026 LinearRegression(normalize = False, fit_intercept= False) 线性回归预测集评分: 0.689427235535854 线性回归训练集评分: 0.6947857687516026 LinearRegression(normalize = True, fit_intercept= True) 线性回归预测集评分: 0.740552064611524 线性回归训练集评分: 0.7422107889561247 LinearRegression(normalize = True, fit_intercept= True) 线性回归预测集评分: 0.740552064611524 线性回归训练集评分: 0.7422107889561247

    作者回复: 置顶!

    2021-09-06
    2
    14
  • ZzzL
    老师代码有点小错误。 在输出“当前模型的4个特征的权重”那里应该修改为(是linereg_model不是model): print('当前模型的4个特征的权重分别是: ', linereg_model.coef_) print('当前模型的截距(偏置)是: ', linereg_model.intercept_)

    作者回复: 谢谢同学细心的指正,我们会更新这块代码。

    2022-04-17
    5
  • u
    代码: @pytest.mark.parametrize("fit_intercept", [True, False]) @pytest.mark.parametrize("normalize", [True, False]) def test_train_model(fit_intercept, normalize): df_cleaned = df_data.dropna() feature_set = df_cleaned.drop(['浏览量'], axis=1) label_set = df_cleaned['浏览量'] x_train, x_test, y_train, y_test = train_test_split(feature_set, label_set, train_size=0.8, test_size=0.2, random_state=0) line_reg_model = LR(fit_intercept=fit_intercept, normalize=normalize) line_reg_model.fit(x_train, y_train) y_pred = line_reg_model.predict(x_test) features = x_test.copy() features['真浏览量'] = y_test features['预测浏览量'] = y_pred print() print("===============fit_intercept=", fit_intercept, ",normalize=", normalize, "====================") print("模型的权重分别是:", line_reg_model.coef_) print("模型的截距是:", line_reg_model.intercept_) print("线性回归预测分数是:", line_reg_model.score(x_test, y_test)) print("========================================")

    作者回复: 👍

    2021-09-07
    5
  • 🇱 、🇲
    佳哥,我在删除nan的行之后,再统计NAN出现的次数,还是有nan。这就导致后面建模型,报错 ValueError: Input contains NaN, infinity or a value too large for dtype('float64').

    作者回复: 明佬群中解决了对吧,用inplace = True让删除语句直接修改原有df对象。

    2021-11-10
    2
    2
  • 蝶舞清风寒
    线性回归函数:LinearRegression 1、fit_intercept=True, bool型,默认为True,对训练数据进行中心化,false的话,说明数据已经进行中心化; 2、 normalize布尔型,默认为false,说明:是否对数据进行标准化处理; 步骤:数据清洗、数据集成、数据变化、数据分析。 我理解这主要是为了数据变化,实现数据正态分布。

    作者回复: 1、fit_intercept=True, bool型,默认为True,对训练数据进行中心化,false的话,说明数据已经进行中心化;------ 总结的很好哦! 2. normalize布尔型,默认为false,说明:是否对数据进行标准化处理;---- 我对文档的理解应该是对数据进行某种归一化缩放,(If True, the regressors X will be normalized before regression by subtracting the mean and dividing by the l2-norm. ),如果需要标准化,实现数据的正态分布,应该使用StandardScaler。 ---- 所以这个normalize和标准化(standardize)还是有区别的,这是我的理解。😁

    2021-09-13
    2
    2
  • GAC·DU
    对fit_intercept和normalize这两个参数做了一下测试,发现normalize的值是True还是False对模型评估的值几乎没有影响,但是fit_intercept的值如果为False对模型评估值影响较大,我用google colab进行的测试。

    作者回复: 课代表!

    2021-09-06
    3
    2
  • 年轻
    👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍

    作者回复: 给力!后续内容更精彩,敬请期待。

    2021-09-06
    2
  • 河宣潮广
    有个问题,请教老师,热度指数和其他几个变量是不是有明确的计算公式。

    作者回复: 这里只是一个极简化了的示例,因此并没有明确计算公式。在具体的业务模型中,不同场景的业务指标都会有对应的计算方法,不过这并非这个示例的关注点。

    2021-10-03
    1
收起评论
显示
设置
留言
21
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部