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

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

    共 4 条评论
    7
  • 茜茜
    置顶
    2021-09-06
    在方法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
    展开

    作者回复: 十分认真!

    共 4 条评论
    10
  • 在路上
    置顶
    2021-09-06
    佳哥好,这节课的示例在我的电脑上运行会报错: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
    展开

    作者回复: 置顶!

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

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

    
    5
  • u
    2021-09-07
    代码: @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("========================================")
    展开

    作者回复: 👍

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

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

    共 2 条评论
    2
  • 蝶舞清风寒
    2021-09-13
    线性回归函数: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)还是有区别的,这是我的理解。😁

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

    作者回复: 课代表!

    共 3 条评论
    2
  • 年轻
    2021-09-06
    👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍

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

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

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

    
    1