当前位置: 首页 > 科技观察

九大回归算法总结_0

时间:2023-03-21 15:07:00 科技观察

线性回归通常是人们学习机器学习和数据科学的第一个算法。它简单易懂,但由于功能有限,在实际业务中并不是最佳选择。大多数时候,线性回归被用作基线模型来评估和比较研究中的新方法。在处理实际问题时,我们应该知道并尝试过许多其他的回归算法。在本文中,使用Scikit-learn和XGBoost通过动手练习学习9种流行的回归算法。这篇文章的结构如下:写的比较早,这个数据使用了一个知名的数据科学公共数据集,隐藏在Python第三方vega_datasets模块中。vega_datasets中有相当多的数据集,包括统计数据和地理数据,还有不同数据量的版本。例如,航班数据集包含2k、5k、200k和3m等多个版本。调用是写:df=data('iris')ordf=data.iris(),数据存在于Anaconda3/Lib/site-packages/vega_datasets目录下,本地存储在local_datasets.json中描述。本地存储有csv和json格式。导入并使用数据集df=data.cars()df.head()df.info()RangeIndex:406entries,0to405Datacolumns(total9columns):#Column非空计数Dtype-----------------------------0名称406非空对象1Miles_per_Gallon398非空float642气缸406非空int643排量406非空float644马力400非空float645Weight_in_lbs406非空int646加速度406非空float647年406非空datetime64[ns40]8原点数据类型:datetime64[ns](1"ns"),float64(4),int64(2),object(2)内存使用:28.7+KB数据处理#过滤特定列中的NaN行df.dropna(subset=['Horsepower','Miles_per_Gallon'],inplace=True)df.sort_values(by='Horsepower',inplace=True)#数据转换X=df['Horsepower'].to_numpy().reshape(-1,1)y=df['Miles_per_Gallon'].to_numpy().reshape(-1,1)plt.scatter(X,y,color='teal',edgecolors='black',label='Horsepowervs.Miles_per_Gallon')plt.legend()plt.show()1.线性回归线性回归通常是学习机器学习和数据科学的第一个算法线性回归是一个假设输入变量(X)和单个输出变量(y)之间存在线性关系的线性模型。一般来说,有两种情况:单变量线性回归:表示单个输入变量和单个输出变量模型之间的关系。多元线性回归(也称为多元线性回归):它模拟多个输入变量和单个输出变量之间的关系。这个算法很常见,Scikit-learn[2]内置了简单线性回归LinearRegression()算法。接下来用小猴子创建一个LinearRegression对象,使用训练数据进行训练。fromsklearn.linear_modelimportLinearRegression#创建并训练模型linear_regressor=LinearRegression()linear_regressor.fit(X,y)训练完成后可以使用LinearRegression的coef_属性查看模型系数参数:linear_regressor.coef_array([[-0.15784473]])现在使用经过训练的模型并为训练数据拟合一条线。#绘制训练数据的点和拟合线plt.scatter(X,y,color='RoyalBlue',edgecolors='black',label='Horsepowervs.Miles_per_Gallon')plt.plot(X,linear_regressor.predict(X),color='orange',label='Linearregressor')plt.title('LinearRegression')plt.legend()plt.show()总结一下线性回归的几个要点:FastandeasytomodelwhenLinearregression当要建模的关系不是很复杂并且您没有大量数据时特别有用。非常直观地理解和解释。它对异常值非常敏感。2.多项式回归当人们想要为非线性可分数据创建模型时,多项式回归是最流行的选择之一。它类似于线性回归,但使用变量X和y之间的关系并找到绘制适合数据点的曲线的最佳方法。对于多项式回归,一些自变量的幂大于1。例如,可以提出如下二次模型:β_0、β_1和β_2是系数x是变量/特征ε是残差Scikit-learn内置多项式回归PolynomialFeatures。首先,我们需要生成一个由指定次数的所有多项式特征组成的特征矩阵:fromsklearn.preprocessingimportPolynomialFeatures#Generatematrixforthequadraticmodel#这里简单生成X^0X^1和X^2的矩阵poly_reg=PolynomialFeatures(degree=2)X_poly=poly_reg.fit_transform(X)接下来,让我们创建一个LinearRegression对象并将其拟合到我们刚刚生成的X_poly特征矩阵。#多项式回归模型poly_reg_model=LinearRegression()poly_reg_model.fit(X_poly,y)现在采用模型并用一条线拟合训练数据,X_plot如下所示:#绘制点和拟合线以训练数据plt.scatter(X,y,color='DarkTurquoise',edgecolors='black',label='Horsepowervs.Miles_per_Gallon')plt.plot(X,poly_reg_model.predict(X_poly),color='orange',label='多项式回归量')plt.title('PolynomialRegression')plt.legend()plt.show()总结了关于多项式回归的几个关键点:能够对非线性可分数据建模;线性回归不能。它总体上更灵活,可以模拟一些相当复杂的关系。完全控制特征变量的建模(可以指定设置指数)。需要仔细设计,并且需要一些数据知识来选择最佳索引。如果指数选择不当,很容易出现过拟合。3.支持向量回归众所周知,支持向量机在处理分类问题上非常有效。事实上,支持向量机也常用于回归问题,称为支持向量回归(SVR)。同样,Scikit-learn内置了这个SVR()方法。在拟合SVR模型之前,通常最好对数据执行数据归一化操作并缩放特征。数据归一化的目的是保证每个特征具有相似的重要性。我们通过StandardScaler()方法对训练数据进行操作。fromsklearn.svmimportSVRfromsklearn.preprocessingimportStandardScaler#执行特征缩放scaled_X=StandardScaler()scaled_y=StandardScaler()scaled_X=scaled_X.fit_transform(X)scaled_y=scaled_y.fit_transform(y)接下来,我们用Object创建一个SVR内核设置为“rbf”,gamma设置为“auto”。之后,我们调用fit()来拟合缩放后的训练数据:svr_regressor=SVR(kernel='rbf',gamma='auto')svr_regressor.fit(scaled_X,scaled_y.ravel())现在获取模型并将其设置为training对数据拟合了一条直线,scaled_X看起来像这样:scaled_X),color='orange',label='SVR')plt.title('SimpleVectorRegression')plt.legend()plt.show()总结支持向量回归的几个关键点对离群点具有鲁棒性,在高维空间中有效它具有出色的泛化能力(可以正确适应新的、以前未见过的数据)如果特征数量远大于样本数量,则容易过度拟合4.DecisionTreesRegressionDecisionTrees(DT)是一种用于分类和回归的非参数监督学习方法。目标是创建一个树模型,通过学习从数据特征推断出的简单决策规则来预测目标变量的值。可以将树视为分段常数近似。决策树回归也很常见,以至于Scikit-learn有一个内置的DecisionTreeRegressor。DecisionTreeRegressor对象可以在没有特征缩放的情况下创建,如下所示:fromsklearn.treeimportDecisionTreeRegressor#不需要特征缩放,因为它会自己处理。tree_regressor=DecisionTreeRegressor(random_state=0)tree_regressor.fit(X,y)接下来用训练好的模型绘制拟合曲线。X_grid=np.arange(min(X),max(X),0.01)X_grid=X_grid.reshape(len(X_grid),1)plt.scatter(X,y,color='DarkTurquoise',edgecolors='black',label='Train')plt.plot(X_grid,tree_regressor.predict(X_grid),color='orange',label='树回归')plt.title('树回归')plt.legend()plt.show()总结关于决策树的几个要点:易于理解和解释,决策树可以可视化。适用于离散值和连续值。使用DT预测数据的成本是训练树的训练数据对数量的对数。决策树的预测既不平滑也不连续(表现为分段常数近似,如上图所示)。5.随机森林回归总的来说,随机森林回归与决策树回归非常相似,因为它是一种元估计器,可以在数据集的各个子样本上拟合许多决策树,并使用平均来提高预测准确性和控制过度拟合。随机森林回归器在回归方面可能比决策树表现更好,也可能不会表现更好(尽管它通常在分类方面表现更好),因为树构建算法本质上具有微妙的过度拟合-欠拟合权衡。随机森林回归是如此普遍,以至于Scikit-learn内置了一个RandomForestRegressor。首先,我们需要创建一个具有指定数量估计器的RandomForestRegressor对象,如下所示:fromsklearn.ensembleimportRandomForestRegressorforest_regressor=RandomForestRegressor(n_estimators=300,random_state=0)forest_regressor.fit(X,y.ravel())下面使用训练好的模型绘制拟合曲线。X_grid=np.arange(min(X),max(X),0.01)X_grid=X_grid.reshape(len(X_grid),1)plt.scatter(X,y,color='DarkTurquoise',edgecolors='black',label='Train')plt.plot(X_grid,forest_regressor.predict(X_grid),color='orange',label='随机森林回归')plt.title('随机森林回归')plt.legend()plt.show()总结了关于随机森林回归的几个关键点:需要注意减少过度拟合并提高决策树的准确性决策树将它们的输出组合起来6.LASSO回归LASSO回归是使用收缩的线性回归的变体。收缩是将数据值向中心点作为均值收缩的过程。这种类型的回归非常适合表现出严重多重共线性(特征彼此之间的严重相关性)的模型。Scikit-learn内置了LassoCV.fromsklearn.linear_modelimportLassoCVlasso=LassoCV()lasso.fit(X,y.ravel())使用下面训练好的模型绘制拟合曲线。plt.scatter(X,y,color='teal',edgecolors='black',label='实际观察点')plt.plot(X,lasso.predict(X),color='orange',label='LASSOregressor')plt.title('LASSORegression')plt.legend()plt.show()总结关于lassoregression的几个要点:最常用于剔除自动变量和选择特征。它非常适合表现出严重多重共线性(特征彼此高度相关)的模型。带L1正则化的LASSO回归LASSO回归被认为比Ridge更好,因为它只选择一些特征并将其他特征的系数降低为零。7.岭回归岭回归与LASSO回归非常相似,因为这两种技术都使用收缩。岭回归和LASSO回归都是表现出严重多重共线性(特征彼此高度相关)的模型的良好候选者。它们之间的主要区别在于Ridge使用L2正则化,这意味着没有一个系数会像LASSO回归中那样变为零(而是接近于零)。Scikit-learn内置了RidgeCV.fromsklearn.linear_modelimportRidgeCVridge=RidgeCV()ridge.fit(X,y)使用下面训练好的模型绘制拟合曲线。plt.scatter(X,y,color='teal',edgecolors='black',label='Train')plt.plot(X,ridge.predict(X),color='orange',label='岭回归量')plt.title('RidgeRegression')plt.legend()plt.show()总结关于RidgeRegression的几个关键点:它适用于表现出严重多重共线性(特征彼此高度相关)的模型。岭回归使用L2正则化,贡献小的特征将具有接近于零的系数。由于L2正则化的性质,岭回归被认为不如LASSO。8.ElasticNetRegressionElasticNet是另一种用L1和L2正则化训练的线性回归模型。它是LASSO和岭回归技术的混合体,因此也非常适合表现出严重多重共线性(特征彼此高度相关)的模型。Lasso和Ridge之间权衡的一个实际优势是它允许Elastic-Net在旋转时继承Ridge的一些稳定性。Scikit-learn有一个内置的ElasticNetCV模型。fromsklearn.linear_modelimportElasticNetCVElasticNet=ElasticNetCV()elasticNet.fit(X,y.ravel())接下来使用训练好的模型绘制拟合曲线。plt.scatter(X,y,color='DarkTurquoise',edgecolors='black',label='Train')plt.plot(X,elasticNet.predict(X),color='orange',label='ElasticNet回归器')plt.title('ElasticNetRegression')plt.legend()plt.show()ElasticNet回归的几个关键点总结:ElasticNet总是优于LASSO和Ri??dge,因为它解决了两种算法ElasticNet与用于确定最佳解决方案的两个lambda值的额外开销。9.XGBoostRegressionExtremeGradientBoosting(XGBoost)是梯度提升算法的高效实现。梯度提升是指一类可用于分类或回归问题的集成机器学习算法。XGBoost是一个开源库,最初由tianqi-chen[3]在其2016年题为“XGBoost:AScalableTreeBoostingSystem[4]”的论文中开发。该算法旨在计算高效且高效。第一步是安装XGBoost库(如果尚未安装)。pipinstallxgboost可以通过创建以下实例来定义XGBoost模型XGBRegressor:fromxgboostimportXGBRegressor#createanx??gboostregressionmodelmodel=XGBRegressor(n_estimators=1000,max_depth=7,eta=0.1,subsample=0.7,colsample_bytree=0.8,)n_合奏中的树木数量通常会增加,直到看不到进一步的改善。max_depth:每棵树的最大深度,通常取值在1到10之间。eta:用于给每个模型加权的学习率,通常设置为较小的值如0.3、0.1、0.01或更小。subsample:每棵树使用的样本数,设置为0到1之间的值,通常1.0使用所有样本。colsample_bytree:每棵树使用的特征(列)数,设置为0到1之间的值,通常1.0使用所有特征。接下来,使用训练好的模型绘制拟合曲线。plt.scatter(X,y,color='DarkTurquoise',edgecolors='black',label='Train')plt.plot(X,model.predict(X),color='orange',label='XGBoost回归器')plt.title('XGBoostRegression')plt.legend()plt.show()总结XGBoost的几个关键点:XGBoost在稀疏和非结构化数据上表现不佳。该算法旨在计算效率高且效率高,但对于大数据集,训练时间仍然相当长并且对异常值敏感。本文到此结束。在本文中,我们通过使用Scikit-learn和XGBoost的动手实践来介绍它。九种流行的回归算法。在解决实际问题时,可以尝试不同的算法,找到解决实际问题的最佳回归模型。