100天机器学习(100-Days-Of-ML)day3多元线性回归及虚拟变量陷阱分析

本系列为100天机器学习学习笔记。详细请参考下方作者链接:
100天机器学习github:
https://github.com/MLEveryday/100-Days-Of-ML-Code
Day3多元线性回归
在这里插入图片描述

第1步: 数据预处理

导入库:

import pandas as pd
import numpy as np

导入数据集

dataset = pd.read_csv('50_Startups.csv')
X = dataset.iloc[ : , :-1].values
Y = dataset.iloc[ : ,  4 ].values

数据集:
在这里插入图片描述
将类别数据数字化

from sklearn.preprocessing import LabelEncoder, OneHotEncoder
labelencoder = LabelEncoder()
X[: , 3] = labelencoder.fit_transform(X[ : , 3])
onehotencoder = OneHotEncoder(categorical_features = [3])
X = onehotencoder.fit_transform(X).toarray()

Labelenconder是把字符串变为0,1,2。之后再用onehot编码。
此时的x:
在这里插入图片描述
存在所谓的虚拟变量陷阱。意思就是:其实state只有3种取值,理论上2位二进制就可以表示,而这里用100,010,001三种表示。其实若把第一位统一去掉,变为00,10,01也是可以区分的。所以这里需要做一个处理:
躲避虚拟变量陷阱,把第一列去掉了

X = X[: , 1:]

变成了:
在这里插入图片描述
减少了多余的一列。
拆分数据集为训练集和测试集:

from sklearn.model_selection import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 0.2, random_state = 0)

第2步: 在训练集上训练多元线性回归模型

from sklearn.linear_model import LinearRegression
regressor = LinearRegression()
regressor.fit(X_train, Y_train)

Step 3: 在测试集上预测结果

y_pred = regressor.predict(X_test)

至此,搬运完成了下面加一些自己的东西。
误差可视化:

import pylab as plt
plt.plot((Y_test.min(),Y_test.max()),(Y_test.min(),Y_test.max()),color="blue")
plt.scatter(Y_test,y_pred,color='red')
plt.xlabel("Y_test");plt.ylabel("Y_pred")
plt.style.use('ggplot')
plt.show()

在这里插入图片描述
倘若我们不处理虚拟变量陷阱:
在这里插入图片描述
误差是一模一样的。为什么呢?我认为是sklearn内部自己帮我们处理了这个问题。
其实这个虚拟变量陷阱是一个用大学一年级知识就能很好解决的问题,并不复杂,它到底是什么?
我们来看看所谓的虚拟变量陷阱:

“虚拟变量陷阱”的实质是:完全多重共线性。自变量中包含了过多的虚拟变量造成的错误;当模型中既有整体截距对每一组都设有一个虚拟变量时,该陷阱就产生了。或者说,由于引入虚拟变量带来的完全共线性现象就是虚拟变量陷阱。

https://bbs.pinggu.org/thread-2949464-1-1.html
因为完全的多重共线性将导致无法估计参数。
在这里插入图片描述

伍德里奇的《计量经济学导论》中提到了“虚拟变量陷阱”,称在包含截距项时,两个特征要引入1个虚拟变量,如果引入2个,就是完全多重共线。
但在不包含截距项时,引入两个虚拟变量则不会存在虚拟变量陷阱。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上面图片来自:https://bbs.pinggu.org/thread-1273924-1-1.html

猜你喜欢

转载自blog.csdn.net/ssswill/article/details/86151933