尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Python多元线性回归实战:从数据准备到模型诊断与业务解读

Python多元线性回归实战:从数据准备到模型诊断与业务解读 1. 项目缘起从Excel到Python一个数据分析师的效率革命几年前我还在用Excel的“数据分析”工具包处理多元线性回归。每次遇到十几个自变量光是整理数据、检查共线性、解读那一大串输出结果就够折腾半天。更别提模型诊断、假设检验这些稍微深入一点的需求Excel就显得力不从心过程繁琐且容易出错。直到我开始系统地将Python引入日常工作流才发现处理这类统计问题可以如此高效、清晰且可复现。这不仅仅是换了个工具而是整个分析思维和工作模式的升级。今天要聊的就是如何利用Python这个强大的“瑞士军刀”来解决多元线性回归中的数据统计问题。无论你是刚接触数据分析的学生还是希望从传统工具如SPSS、Excel转向编程分析的业务分析师亦或是需要快速验证想法的算法工程师掌握这套方法都能让你事半功倍。我们将不止步于“跑出一个模型”而是深入整个流程从数据准备、模型构建、统计检验到结果解读与可视化把每个环节的“为什么”和“怎么做”都掰开揉碎讲清楚。你会发现用Python做回归分析核心不在于写多复杂的代码而在于理解统计原理并用代码精准地实现和验证这些原理。2. 环境搭建与核心库选择为什么是它们工欲善其事必先利其器。在Python的数据科学生态里库的选择很多但针对统计建模尤其是回归分析有一个非常成熟且高效的工具组合。盲目安装所有库只会让环境混乱我们需要的是精准打击。2.1 基础三剑客NumPy, Pandas, Matplotlib这是Python数据分析的基石缺一不可。NumPy提供高性能的多维数组对象和数学函数。回归分析中大量的矩阵运算如求逆、点乘底层都依赖它。它的数组结构是其他库进行数值计算的基础。Pandas数据操作的灵魂。我们面对的数据通常是表格形式的Pandas的DataFrame和Series对象让数据清洗、筛选、合并、分组变得异常简单。读取CSV、Excel文件处理缺失值创建虚拟变量等预处理工作几乎全靠它。Matplotlib绘图库的鼻祖。虽然样式稍显古朴但功能强大且可控性极高。用于绘制残差图、预测值与真实值对比图、回归系数可视化等是模型诊断和结果展示的必备。安装它们非常简单通常使用pip即可pip install numpy pandas matplotlib2.2 统计建模核心Statsmodels 与 Scikit-learn这是两个侧重点不同的库很多人会困惑如何选择。我的经验是深入统计推断用Statsmodels追求预测工程化用Scikit-learn。对于以“数据统计”为核心的多元线性回归Statsmodels往往是更优解。Statsmodels这是一个为统计学家和计量经济学家设计的库。它的核心优势在于提供极其详细和专业的统计输出。运行一个OLS普通最小二乘回归它会给你一份类似R语言或SPSS风格的完整摘要包括每个系数的估计值、标准误、t统计量、P值、置信区间。模型整体的R-squared、调整后R-squared、F统计量及其P值。Durbin-Watson序列相关、Jarque-Bera残差正态性、Omnibus等诊断检验统计量。它还内置了强大的模型诊断工具如绘制部分回归图、影响图等。简单来说如果你需要写一份严谨的数据分析报告需要解释每一个系数的统计显著性需要检验模型的各项假设Statsmodels是你的不二之选。pip install statsmodelsScikit-learn这是一个面向机器学习的库设计理念是统一、简洁的API。它的线性模型模块sklearn.linear_model.LinearRegression非常高效适合处理大规模数据并且能无缝接入复杂的机器学习流水线如交叉验证、网格搜索。但是它的模型输出非常“简约”默认只给出系数和截距不提供P值、置信区间等统计量。虽然可以通过其他方法计算但不如Statsmodels直接。适用场景当你明确知道目标是预测且对模型的可解释性、假设检验要求不高时或者需要将回归模型作为更大流程中的一个环节时。pip install scikit-learn在本篇的后续内容中我们将以Statsmodels作为主要工具进行演示因为它最能体现“解决数据统计”这一目标。当然我也会在关键节点指出Scikit-learn的对应做法供你对比参考。2.3 效率提升利器Seaborn 与 Jupyter NotebookSeaborn基于Matplotlib的高级绘图库。它用更简洁的语法绘制出更美观的统计图形。在数据探索阶段用Seaborn快速绘制变量间的散点图矩阵、分布图、箱线图能直观地发现关系与异常。pip install seabornJupyter Notebook/Lab交互式编程环境。对于数据分析这种探索性强的工作能边写代码、边看结果、边记笔记Markdown的Notebook是绝配。它保证了分析过程的可复现性和可读性。3. 数据准备与探索性分析模型成功的基石很多模型效果不佳根子都出在数据上。直接套用原始数据跑回归无异于闭着眼睛开车。这一步往往比建模本身花费更多时间也更重要。3.1 数据读取与初窥假设我们有一个CSV文件house_price.csv包含房价price以及面积area、卧室数量bedrooms、房龄age、学区评分school_score等自变量。import pandas as pd import numpy as np import seaborn as sns import matplotlib.pyplot as plt # 设置绘图风格 sns.set(stylewhitegrid) # 读取数据 df pd.read_csv(house_price.csv) # 查看数据前5行和基本信息 print(df.head()) print(df.info()) print(df.describe())df.info()帮你快速了解数据维度、类型和缺失值情况。df.describe()给出数值型变量的描述性统计均值、标准差、分位数等对数据分布有个初步把握。3.2 缺失值处理不是简单删除那么简单Statsmodels的OLS在遇到缺失值NaN时会直接报错必须处理。探查缺失df.isnull().sum()可以查看每列缺失数量。处理策略删除如果缺失样本很少如5%且是随机缺失可以直接删除该行df.dropna(inplaceTrue)。这是最简单的方法但可能损失信息。填充连续变量常用均值、中位数或众数填充。df[age].fillna(df[age].median(), inplaceTrue)分类变量用众数或单独设为“未知”类别。更高级的方法使用回归、KNN甚至模型如MICE来预测缺失值。但对于一般的回归分析中位数/众数填充在多数情况下是可接受的起点。注意填充方法会影响数据的分布和变量关系尤其是缺失非随机时。处理完后最好再次检查分布是否有剧烈变化。3.3 分类变量编码让计算机理解“类型”回归模型只能处理数值。如果自变量中有像“房屋类型”别墅、公寓、平房这样的分类变量必须进行编码。独热编码One-Hot Encoding最常用、最推荐的方法。为每个类别创建一个新的二值0/1变量。# 使用pandas的get_dummies函数 drop_first参数为避免多重共线性见下文 df_encoded pd.get_dummies(df, columns[house_type], drop_firstTrue, prefixtype)drop_firstTrue是关键它丢弃第一个类别以该类别作为参照基准。例如有“别墅”、“公寓”、“平房”三类编码后生成type_公寓和type_平房两个新列。当这两个列都为0时就代表基准类别“别墅”。这样可以避免“虚拟变量陷阱”完美多重共线性。3.4 探索性数据分析与可视化用眼睛发现关系在建模前可视化能提供无可替代的洞察。单变量分布检查每个变量的分布是否严重偏态是否存在极端异常值。fig, axes plt.subplots(2, 2, figsize(12, 8)) df[price].hist(axaxes[0,0], bins30); axes[0,0].set_title(Price Distribution) df[area].hist(axaxes[0,1], bins30); axes[0,1].set_title(Area Distribution) # 绘制箱线图查看异常值 df.boxplot(columnprice, axaxes[1,0]); axes[1,0].set_title(Price Boxplot) df.boxplot(columnarea, axaxes[1,1]); axes[1,1].set_title(Area Boxplot) plt.tight_layout() plt.show()变量间关系查看因变量与各自变量以及自变量之间的两两关系。# 散点图矩阵 sns.pairplot(df[[price, area, bedrooms, age]]) plt.show() # 相关性热力图 corr_matrix df[[price, area, bedrooms, age, school_score]].corr() sns.heatmap(corr_matrix, annotTrue, cmapcoolwarm, center0) plt.title(Correlation Heatmap) plt.show()从热力图中你需要特别关注自变量之间的高相关系数例如 0.8这可能是多重共线性的预警信号。3.5 特征工程初探创造更有力的预测因子有时直接使用原始变量效果不好需要构造新特征。交互项考虑两个变量的共同影响。例如area * school_score面积与学区的交互可能意味着在好学区每平米单价更高。多项式项研究非线性关系。例如增加area**2项来探究面积对房价的影响是否存在边际效应递减先快速上升后趋缓。分箱/离散化将连续变量如房龄分段转化为有序分类变量有时能更好地捕捉非线性模式。# 创建交互项 df[area_school_interaction] df[area] * df[school_score] # 创建二次项 df[area_squared] df[area] ** 2注意添加交互项或多项式项后共线性问题会变得复杂需要更严格的检验。4. 构建与解读多元线性回归模型数据准备妥当终于可以开始建模了。我们将使用Statsmodels的两种API风格公式API和数组API。公式API更接近R语言写起来直观数组API更灵活适合编程式构建。4.1 使用公式API像写数学公式一样建模这是我最推荐初学者使用的方式清晰易懂。import statsmodels.api as sm import statsmodels.formula.api as smf # 定义回归公式 # price ~ area bedrooms age school_score type_公寓 type_平房 # 波浪号~左边是因变量右边是自变量用号连接。 # C(house_type)表示将house_type当作分类变量处理Statsmodels会自动进行编码同样会处理参照系。 formula price ~ area bedrooms age school_score C(house_type) # 拟合模型 model smf.ols(formulaformula, datadf).fit() # 打印详细的模型摘要 print(model.summary())运行model.summary()你会得到一份信息量巨大的输出。我们来逐块解读这个摘要里最重要的部分第一部分模型总体评估OLS Regression Results Dep. Variable: price R-squared: 0.812 Model: OLS Adj. R-squared: 0.805 Method: Least Squares F-statistic: 119.4 Date: ... Prob (F-statistic): 2.13e-40 Time: ... Log-Likelihood: -1342.1 No. Observations: 200 AIC: 2696. Df Residuals: 193 BIC: 2719. Df Model: 6 Covariance Type: nonrobustR-squaredR方0.812。表示模型解释了房价81.2%的变异。越高越好但在社会科学领域0.3-0.6也算不错。要注意增加变量总会让R方上升即使是无用变量。Adj. R-squared调整R方0.805。这是考虑了自变量个数惩罚后的R方比单纯的R方更可靠。在比较不同变量数的模型时应主要参考调整R方。F-statistic Prob (F-statistic)F统计量119.4P值Prob极小2.13e-40。这个检验的原假设是“所有自变量的系数均为0”。P值远小于0.05强烈拒绝原假设说明至少有一个自变量对预测房价是有效的。这是模型整体显著性的检验。第二部分系数详情与统计检验核心 coef std err t P|t| [0.025 0.975] ------------------------------------------------------------------------------ Intercept 5.683e04 6732. 8.442 0.000 4.35e04 7.01e04 area 218.500 12.36 17.68 0.000 194.16 242.84 bedrooms 1.243e04 2456. 5.059 0.000 7582. 1.73e04 age -1256.900 289.3 -4.345 0.000 -1827. -686.3 school_score 1.152e04 1207. 9.542 0.000 9141. 1.39e04 C(house_type)[T.公寓] -2.858e04 3187. -8.966 0.000 -3.49e04 -2.23e04 C(house_type)[T.平房] -4.127e04 4221. -9.777 0.000 -4.96e04 -3.29e04这是解读的重中之重每一行代表一个自变量包括截距。coef系数在控制其他变量不变的情况下该自变量每增加一个单位因变量平均变化多少。例如area: 218.5面积每增加1平方米房价平均上涨218.5元控制卧室、房龄等其他因素后。age: -1256.9房龄每增加1年房价平均下降1256.9元。C(house_type)[T.公寓]: -28580以“别墅”为参照公寓的平均房价要低28580元。std err标准误系数估计的不确定性度量。越小越好说明估计越精确。t 和 P|t|t统计量与P值单个系数的显著性检验。原假设是“该系数等于0”。例如area的P值为0.000拒绝原假设说明面积对房价有显著影响。通常以P值0.05作为显著标准。bedrooms的P值也是0.000同样显著。[0.025 0.975]95%置信区间我们有95%的把握认为真实的系数值落在这个区间内。如果区间不包含0也与P值0.05的结论一致。第三部分模型诊断统计量 Omnibus: 2.567 Durbin-Watson: 2.008 Prob(Omnibus): 0.277 Jarque-Bera (JB): 2.427 Skew: -0.192 Prob(JB): 0.297 Kurtosis: 3.345 Cond. No. 312.Durbin-Watson检验残差是否存在自相关常用于时间序列数据。值接近2表示无自相关接近0为正相关接近4为负相关。本例2.008很好。Jarque-Bera (JB) / Prob(JB)检验残差是否服从正态分布。原假设是“残差服从正态分布”。本例P值(Prob(JB))为0.297 0.05不能拒绝原假设初步认为残差正态性尚可。Cond. No.条件数用于诊断多重共线性的严重程度。通常认为大于30可能表示存在较强的共线性。本例为312这是一个强烈的警告信号提示我们需要深入检查共线性问题。4.2 使用数组API更底层的控制数组API要求我们将因变量和自变量明确地准备好矩阵形式。Statsmodels的OLS默认不包含截距项需要手动添加一个常数列。# 准备数据 # 假设df_encoded是已经处理好分类变量编码的DataFrame X df_encoded[[area, bedrooms, age, school_score, type_公寓, type_平房]] # 特征矩阵 y df_encoded[price] # 目标变量 # 给特征矩阵添加常数项截距 X sm.add_constant(X) # 构建并拟合模型 model sm.OLS(y, X).fit() # 输出摘要与公式API结果一致 print(model.summary())数组API在需要动态构建特征矩阵或集成到复杂流水线时非常有用。4.3 关键问题多重共线性诊断与应对从上面的摘要我们看到条件数Cond. No.很高这是一个警报。多重共线性不会影响模型的预测能力但会使得系数估计不稳定、标准误增大、难以解释单个变量的独立贡献。诊断方法方差膨胀因子VIF这是最常用的定量诊断工具。VIF衡量一个自变量被其他自变量解释的程度。通常VIF 5 或 10 就认为存在较严重的共线性。from statsmodels.stats.outliers_influence import variance_inflation_factor # 计算VIF注意X是包含常数项的特征矩阵 vif_data pd.DataFrame() vif_data[feature] X.columns vif_data[VIF] [variance_inflation_factor(X.values, i) for i in range(X.shape[1])] print(vif_data)如果发现area和area_squared如果添加了的VIF都非常高那就证实了它们之间的共线性。应对策略删除不重要的高VIF变量根据业务知识或初步模型剔除那个贡献较小的高VIF变量。主成分回归PCR或岭回归Ridge这些是处理共线性的高级方法。它们通过牺牲一点无偏性来大幅降低方差获得更稳定的系数估计。Scikit-learn的sklearn.linear_model.Ridge可以很方便地实现岭回归。收集更多数据有时共线性是因为数据量不足导致的增加样本量可能缓解问题。我的经验在商业分析中如果主要目的是预测且共线性变量在业务上都有意义有时可以容忍一定的共线性。但如果目的是因果推断或解释单个变量的影响则必须严肃处理。通常先尝试删除VIF最高的变量观察模型调整R方和系数显著性的变化是一个稳妥的起点。5. 模型诊断你的模型真的“健康”吗得到一个显著的模型和漂亮的R方还不够。线性回归有若干核心假设线性、独立性、同方差性、正态性只有这些假设大致满足模型的统计推断P值、置信区间才是可靠的。模型诊断就是给模型做“体检”。5.1 残差分析四大假设的图形化检验Statsmodels提供了便捷的绘图函数。# 绘制回归诊断图 fig plt.figure(figsize(12, 8)) # 使用statsmodels的图形化诊断 sm.graphics.plot_regress_exog(model, area, figfig) # 针对单个变量‘area’的诊断 # 更全面的诊断图 fig sm.graphics.plot_partregress_grid(model, figfigsize(12, 10)) plt.show() # 或者使用更传统的四合一残差图 fig sm.graphics.qqplot(model.resid, line45, fitTrue) plt.show() # 绘制残差 vs. 拟合值图 plt.scatter(model.fittedvalues, model.resid) plt.axhline(y0, colorr, linestyle--) plt.xlabel(Fitted Values) plt.ylabel(Residuals) plt.title(Residuals vs Fitted) plt.show()你需要重点观察残差 vs. 拟合值图检查同方差性。理想情况是残差随机均匀地分布在0线周围无明显规律如漏斗形、弧形。如果出现漏斗形残差范围随拟合值增大而增大则存在异方差性会低估标准误。Q-Q图检查残差正态性。点应大致围绕45度对角线分布。严重偏离对角线尤其是两端说明残差非正态可能影响系数检验的准确性。残差 vs. 单个预测变量图检查线性关系。残差应随机分布无明显的曲线模式。如果有说明可能需要对该变量加入多项式项或进行变换。5.2 异常值与强影响点诊断个别数据点可能对模型产生不成比例的巨大影响需要识别出来。学生化残差绝对值大于3的点可能是异常值。Cook距离衡量单个数据点对全部系数估计的综合影响。通常认为Cook‘s D 4/nn为样本量的点需要关注。# 获取影响度量 influence model.get_influence() # 计算Cook距离 cooks_d influence.cooks_distance[0] # 找出高影响点 high_influence_idx np.where(cooks_d 4 / len(df))[0] print(fHigh influence points indices: {high_influence_idx})如何处理首先检查这些点是否是数据录入错误。如果不是需要谨慎决定是删除、修正还是保留删除强影响点会改变模型必须报告这一处理。有时强影响点恰恰是业务中需要特别关注的“特殊案例”。5.3 解决常见问题异方差与非线性应对异方差如果残差图显示异方差可以尝试对因变量进行变换如取对数np.log(y)。这在经济学、金融领域很常见因为很多变量呈比例增长。注意变换后系数的解释会发生变化从“单位变化”变为“百分比变化”。使用稳健标准误。Statsmodels的summary函数可以指定协方差类型。model.summary(cov_typeHC3)会输出使用异方差稳健标准误计算的t值和P值这通常是对抗异方差最简单有效的方法且不改变系数估计值。应对非线性如果残差图显示非线性考虑在模型中加入该变量的多项式项如X^2,X^3。对该变量进行非线性变换如对数、平方根。使用分段回归或样条回归等更灵活的方法。6. 模型结果呈现与业务解读从数字到洞见统计指标再漂亮如果不能转化成业务语言价值就大打折扣。6.1 关键结果提取与报告你可以从model对象中提取任何需要的统计量用于生成自动化报告。# 提取关键指标 rsquared model.rsquared adj_rsquared model.rsquared_adj f_pvalue model.f_pvalue params model.params # 系数 conf_int model.conf_int() # 置信区间 pvalues model.pvalues # P值 # 创建一个漂亮的结果汇总DataFrame results_df pd.DataFrame({ Coefficient: params, Std_Error: model.bse, t_value: model.tvalues, P|t|: pvalues, [0.025: conf_int[0], 0.975]: conf_int[1] }) print(results_df.round(4)) # 打印模型整体评估 print(f\n模型整体评估:) print(fR-squared: {rsquared:.4f}) print(fAdjusted R-squared: {adj_rsquared:.4f}) print(fF-statistic p-value: {f_pvalue:.4e}) if f_pvalue 0.05: print(模型整体显著。) else: print(模型整体不显著。)6.2 业务解读示例假设我们最终的模型结果如下经过共线性处理和后area(面积): 系数200, P0.01 95% CI [180, 220]school_score(学区评分): 系数10000, P0.01, 95% CI [8000, 12000]C(house_type)[T.公寓]: 系数-30000, P0.01, 95% CI [-35000, -25000]如何向非技术人员解释“根据我们的数据分析模型在控制了房屋类型、房龄等因素后我们发现面积是核心驱动因素房屋面积每增加1平方米预计房价平均上涨200元。我们有95%的把握认为这个上涨幅度在180元到220元之间。学区价值显著学区评分每提高1分比如从8分到9分房价平均高出1万元。这表明家长愿意为优质教育资源支付显著溢价。房屋类型存在价差与别墅相比公寓的平均价格要低3万元。这一定价差异在统计上是显著的。”注意解读的严谨性始终强调“在控制其他变量的情况下”或“保持其他因素不变”。使用“平均效应”、“关联性”等词语谨慎使用“导致”、“决定”等因果性词汇除非研究设计本身能支持因果推断。置信区间比点估计更重要它给出了估计的不确定性范围。6.3 利用模型进行预测模型最终要用于实践。Statsmodels和Scikit-learn都提供了简单的预测接口。# 假设有新数据new_dataDataFrame格式列名与训练时一致 # 使用公式API模型预测 predictions model.predict(new_data) # 返回预测值数组 # 如果你想同时得到预测区间而不仅仅是点预测需要手动计算过程稍复杂。 # 更简单的做法是对于预测任务可以转向Scikit-learn利用其强大的交叉验证来评估预测误差。 from sklearn.linear_model import LinearRegression from sklearn.model_selection import cross_val_predict from sklearn.metrics import mean_squared_error lr LinearRegression() y_pred_cv cross_val_predict(lr, X, y, cv5) # 5折交叉验证预测 mse_cv mean_squared_error(y, y_pred_cv) print(fCross-Validated RMSE: {np.sqrt(mse_cv):.2f})交叉验证的均方根误差RMSE给出了模型在新数据上预测误差的一个更稳健的估计。7. 进阶思考与常见陷阱走到这里你已经掌握了用Python完成一次标准多元线性回归统计分析的全流程。但在实际项目中还有一些更深层的问题和陷阱需要警惕。7.1 内生性问题看不见的“第三者”这是因果推断中的核心难题。例如我们发现“卧室数量”系数为正且显著。但这真的意味着多一个卧室就能让房价上涨吗可能存在一个“看不见的变量”——房屋整体大小/豪华程度。更大的房子通常卧室更多也更贵。我们模型里的“面积”可能只捕捉了部分“大小”剩下的部分混杂在“卧室数”里。这就导致了遗漏变量偏差使得“卧室数”的系数被高估因为它偷偷携带了“房屋豪华程度”的影响。怎么办纯粹的统计模型很难根本解决内生性。需要增加控制变量尽可能把所有相关的、可测量的因素都放入模型。使用工具变量法IV寻找一个只通过自变量影响因变量的变量。Statsmodels有IV2SLS模块可以实现。差分法或固定效应模型对于面板数据可以消除不随时间变化的遗漏变量影响。随机对照实验RCT黄金标准但在社会科学中往往难以实施。重要提醒在观察性数据中回归分析主要揭示的是“关联”而非“因果”。在做出业务决策时必须结合领域知识谨慎解读。7.2 过拟合与模型泛化如果你的模型在训练数据上R方很高但在新数据上表现很差很可能过拟合了。这通常是因为模型过于复杂变量太多捕捉了训练数据中的噪声。预防使用调整R方而非R方来评价模型使用交叉验证来评估预测误差考虑使用正则化方法如岭回归、Lasso回归它们通过惩罚系数大小来防止过拟合。Scikit-learn的RidgeCV和LassoCV可以自动选择最佳的正则化强度。7.3 变量选择的艺术应该把所有可能的变量都扔进模型吗不是。变量太多会引发共线性、过拟合降低模型可解释性。向前选择/向后淘汰/逐步回归基于统计准则如AIC, BIC自动选择变量。Statsmodels的statsmodels.regression.linear_model.OLS可以配合statsmodels.tools.tools.add_constant和循环来实现也有第三方包如statsmodels.stats.outliers_influence提供一些辅助函数但不如R语言方便。更常见的做法是使用基于Scikit-learn的包装法如RFECV。基于领域知识这是最重要的。一个在统计上显著但无法从业务逻辑上解释的变量应该被怀疑。变量选择应该是统计意义和业务意义的结合。7.4 分类变量与参照组我们之前用drop_firstTrue处理了分类变量。这意味着我们的系数是相对于被丢弃的那个参照组而言的。在报告时必须明确说明参照组是什么。例如“公寓比别墅便宜3万”前提是参照组是“别墅”。如果你改变参照组系数值会变但模型预测结果和整体拟合度不变。用Python解决多元线性回归数据统计是一个将统计理论、编程实践和业务思维紧密结合的过程。它不是一个按部就班的“菜谱”而是一个需要不断诊断、调整、反思的探索性循环。从数据导入到最终解读每一步都充满了选择而每一个选择背后都需要理由。这套流程和思考方式不仅适用于线性回归也是你学习更复杂模型逻辑回归、时间序列、机器学习的坚实基础。我个人的体会是最初几次可能会觉得步骤繁琐但一旦形成肌肉记忆并理解每个步骤的目的你的数据分析能力将获得质的飞跃。下次当你拿到一份新数据时不妨就从这里开始一步步构建、诊断、解读你的第一个Python回归模型。
返回列表