1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 【机器学习个人笔记】part3——用sklearn实现多元线性回归

【机器学习个人笔记】part3——用sklearn实现多元线性回归

时间:2021-10-31 16:06:58

相关推荐

【机器学习个人笔记】part3——用sklearn实现多元线性回归

【机器学习个人笔记】part3——用sklearn实现多元线性回归

简单线性回归可以看做是y = ax + b的函数,多元线性函数则可以看做是y = ax1 + bx2 + cx3 + d的函数。

简单线性回归就是通过一个特征去预测(比如用工作经验去预测薪水),而多元线性回归则是用多个特征去预测。

例子:根据“研究开发经费”、“行政投入”、“市场支出”、“所在区域” 来预测 “公司盈利额”

这里可以用虚拟编码来处理“state”这个特征

但要注意,使用虚拟编码会存在一个虚拟编码陷阱问题。

解决方案:去掉一个特征,比如D2项

什么是虚拟编码陷阱?

在进行虚拟编码操作后,产生了D1和D2两项,但这两项是存在数学关系的,D1 + D2 = 1,即可以用D1来表示D2,D2 = 1 - D1,为了去掉冗余的特征,所以要删掉D1或D2.

编码步骤:

导入标准库、导入数据集

# Importing the librariesimport numpy as npimport matplotlib.pyplot as pltimport pandas as pd# Importing the datasetdataset = pd.read_csv('../50_Startups.csv')X = dataset.iloc[:, :-1].valuesy = dataset.iloc[:, 4].values

处理分类数据、虚拟编码、处理虚拟编码陷阱

# encoding categorical data # 处理分类数据,虚拟编码from sklearn.preprocessing import LabelEncoder, OneHotEncoderlabel_encoder = LabelEncoder()X[:,3] = label_encoder.fit_transform(X[:,3])onehotencoder = OneHotEncoder(categorical_features=[3]) # 表示要处理第3列X = onehotencoder.fit_transform(X).toarray()print("---------------")print(type(onehotencoder.fit_transform(X))) # 这里可以看出,onehotencoder.fit_transform(X)是一个scipy格式print(type(X))# X是一个numpy格式,scipy格式转numpy使用toarray()函数# 采用虚拟编码会出现一个问题——虚拟编码陷阱# Avoiding the Dummy Variable TrapX = X[:,1:]

分割训练集和测试集

# Splitting the dataset into the Training set and Test setfrom sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0)

和简单线性回归一样,创建线性回归器,用训练集去拟合回归器

# Fitting Multiple Linear Regression to the Training setfrom sklearn.linear_model import LinearRegressionregressor = LinearRegression() # 创建回归器regressor.fit(X_train, y_train) # 用训练集去拟合回归器

用拟合好的回归器做预测

# Predicting the Test set resultsy_pred = regressor.predict(X_test) #获得预测结果

用反向淘汰进行模型选择

预先设置一个阈值,比如0.05先用完整的模型进行预测观察P-value最大的一项,如果p-value大于阈值,则把这一个特征项去掉,如果小于阈值则直接结束

# Building the optional model using Backward Elimination# 运用反向淘汰选择模型# 并不是所有的特征对于整个模型来说都是非常重要的,其中有一些特征对模型的影响非常小,# 我们应该淘汰掉这些特征。import statsmodels.formula.api as sm# 给训练集加上一个全1列X_train = np.append(arr = np.ones((40,1)), values=X_train, axis=1)X_opt = X_train[:,[0,1,2,3,4,5]]regressor_OLS = sm.OLS(endog = y_train, exog = X_opt).fit()regressor_OLS.summary()# 经检测,发现x2的P>|t|(p_value)最大,所以把这一列去掉X_opt = X_train[:,[0,1,3,4,5]]regressor_OLS = sm.OLS(endog = y_train, exog = X_opt).fit()regressor_OLS.summary()# 经检测,发现x1的p>|t|(p_value)最大,所以把这一列去掉X_opt = X_train[:,[0,3,4,5]]regressor_OLS = sm.OLS(endog = y_train, exog = X_opt).fit()regressor_OLS.summary()# 经检测,发现x2的p>|t|(p_value)最大,所以把这一列去掉X_opt = X_train[:,[0,3,5]]regressor_OLS = sm.OLS(endog = y_train, exog = X_opt).fit()regressor_OLS.summary()# 经检测,发现x2的p>|t|(p_value)最大,所以把这一列去掉X_opt = X_train[:,[0,3]]regressor_OLS = sm.OLS(endog = y_train, exog = X_opt).fit()regressor_OLS.summary()# 最终发现,研发金额对市值的影响最大

比如这里x2的P值最大,所以把x2这一项去掉

图中的R-square和Adj.R-square值越大,代表模型越好

总结

本节难点:

虚拟编码和虚拟编码陷阱反向淘汰算法用statsmodels.formula.api对模型进行评估

完整代码

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。