机器学习第三天 多元线性回归
数据集下载地址
https://www.xiehaoo.com/media/record/pinke/2018/08/50_Startups.csv
多元线性回归尝试通过用一个线性方程来适配观测数据,这个线性方程是在两个以上(包括两个)的特性和响应之间构建的一个关系。多元线性回归的实现步骤和简单线性回归很相似,在评价部分有所不同。你可以用它来找出在预测结果上哪个因素影响力最大,以及不同变量是如何相互关联的。
设想
想要有一个成功的回归分析,确认这些假定很重要。
1、线性:自变量和因变量的关系应该是线性的(即特征值和预测值是线性相关的)
2、保持误差项的方差齐性(常数方差):误差项的分散(方差)必须等同
3、多元正态分布:多元回归假定残差符合正态分布。
4、缺少多重共线性:假设数据有极少甚至没有多重共线性。当特征(或自变量)不是相互独立时、会引发多重共线性。
虚(拟)变量
在多元回归模型中、当遇到数据集是非数值数据类型时,使用分类数据是一个非常有效的方法。
分类数据、是指反映(事物)类别的数据,是离散数据,其数值个数(分类属性)有限(但可能很多)且值之间无序。
比如,按性别分为男、女两类。在一个回归模型中,这些分类值可以用虚变量来表示,变量通常取诸如1或0这样的值,来表示肯定类型或否定类型。
虚拟变量陷阱
虚拟变量是指两个以上(包括两个)变量之间高度相关的情形。简而言之,就是存在一个能够被其他变量预测出的变量。我们举一个存在重复类别(变量)的直观例子:假使我们舍弃男性类别,那么,该类别也可以通过女性类别来定义(女性值为0时,表示男性、为1市表示女性),反之亦然。
解决虚拟变量陷阱的方法是,类别变量减去一:假如有m个类别,那么在模型构建时取m-1个虚拟变量,减去的那个变量可以看作是参照值。
注意
过多的变量可能会降低模型的精确度,尤其是如果存在一些对结果无关的变量,或者存在对其他变量造成很大影响的变量时。这里介绍一些选择合适变量的方法:
1、向前选择法
2、向后选择法(也称 向后剔除法/向后消元法)
3、向前向后法:即结合了上面说的向前法和向后法,先用向前法筛选一遍,再用向后法筛选一遍,直到最后无论怎么筛选模型变量都不再发生变化,就算是结束了
第一步:数据预处理
1.导入相关库 Pandas、Numpy、Sklearn 、Matplotlib
2.导入csv数据集
3.检查缺失数据
4.划分数据集
5.有必要的话,编辑虚拟变量并注意避免虚拟变量陷阱
6.特征缩放用简单线性回归模型的相关库实现
数据预处理通过前两天的学习已经熟悉了需要哪些步骤,就不单独一列一列分析了
import pandas as pd
import numpy as np
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
from sklearn.cross_validation import train_test_split
from sklearn.linear_model import LinearRegression
dataset = pd.read_csv('/Users/xiehao/Desktop/100-Days-Of-ML-Code-master/datasets/50_Startups.csv')
"""
数据表格
R&D Spend Administration Marketing Spend State Profit
165349.2 136897.8 471784.1 New York 192261.83
162597.7 151377.59 443898.53 California 191792.06
153441.51 101145.55 407934.54 Florida 191050.39
144372.41 118671.85 383199.62 New York 182901.99
142107.34 91391.77 366168.42 Florida 166187.94
131876.9 99814.71 362861.36 New York 156991.12
134615.46 147198.87 127716.82 California 156122.51
130298.13 145530.06 323876.68 Florida 155752.6
120542.52 148718.95 311613.29 New York 152211.77
123334.88 108679.17 304981.62 California 149759.96
101913.08 110594.11 229160.95 Florida 146121.95
100671.96 91790.61 249744.55 California 144259.4
93863.75 127320.38 249839.44 Florida 141585.52
91992.39 135495.07 252664.93 California 134307.35
119943.24 156547.42 256512.92 Florida 132602.65
114523.61 122616.84 261776.23 New York 129917.04
78013.11 121597.55 264346.06 California 126992.93
94657.16 145077.58 282574.31 New York 125370.37
91749.16 114175.79 294919.57 Florida 124266.9
86419.7 153514.11 0 New York 122776.86
76253.86 113867.3 298664.47 California 118474.03
78389.47 153773.43 299737.29 New York 111313.02
73994.56 122782.75 303319.26 Florida 110352.25
67532.53 105751.03 304768.73 Florida 108733.99
77044.01 99281.34 140574.81 New York 108552.04
64664.71 139553.16 137962.62 California 107404.34
75328.87 144135.98 134050.07 Florida 105733.54
72107.6 127864.55 353183.81 New York 105008.31
66051.52 182645.56 118148.2 Florida 103282.38
65605.48 153032.06 107138.38 New York 101004.64
61994.48 115641.28 91131.24 Florida 99937.59
61136.38 152701.92 88218.23 New York 97483.56
63408.86 129219.61 46085.25 California 97427.84
55493.95 103057.49 214634.81 Florida 96778.92
46426.07 157693.92 210797.67 California 96712.8
46014.02 85047.44 205517.64 New York 96479.51
28663.76 127056.21 201126.82 Florida 90708.19
44069.95 51283.14 197029.42 California 89949.14
20229.59 65947.93 185265.1 New York 81229.06
38558.51 82982.09 174999.3 California 81005.76
28754.33 118546.05 172795.67 California 78239.91
27892.92 84710.77 164470.71 Florida 77798.83
23640.93 96189.63 148001.11 California 71498.49
15505.73 127382.3 35534.17 New York 69758.98
22177.74 154806.14 28334.72 California 65200.33
1000.23 124153.04 1903.93 New York 64926.08
1315.46 115816.21 297114.46 Florida 49490.75
0 135426.92 0 California 42559.73
542.05 51743.15 0 New York 35673.41
0 116983.8 45173.06 California 14681.4
"""
X = dataset.iloc[:, :-1].values
Y = dataset.iloc[:, 4].values
labelencoder = LabelEncoder()
X[:, 3] = labelencoder.fit_transform(X[:, 3])
onehotencoder = OneHotEncoder(categorical_features=[3])
X = onehotencoder.fit_transform(X).toarray()
X = X[:, 1:]
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=0)
第二步:在训练集上训练模型
这一步和简单线性回归模型处理方式完全一样。
用sklearn.linear_model库的LinearRegression类,在数据集上训练模型。首先,创建一个LinearRegression的对象regressor,接着用LinearRegression类的fit()方法,用对象regressor在数据集上进行训练。
regressor = LinearRegression()
regressor.fit(X_train, Y_train)
第三步:预测结果
在测试集上进行预测,并观察结果。我们将把输出结果保存在向量Y_pred中。在上一步regressor对象使用predict()方法来预测结果
y_pred = regressor.predict(X_test)
>>print(y_pred)
[ 103015.20159797 132582.27760815 132447.73845175 71976.09851258
178537.48221054 116161.24230165 67851.69209676 98791.73374688
113969.43533012 167921.0656955 ]
感谢原作者 Avik-Jain 以及 zhyongquan的汉化
网友评论