1、使用Python进行数据分析——模型开发我们经常使用模型开发来帮助我们预测未来的观测 数据。一个模型将帮助我们理解不同变量之间的确切 关系,以及如何使用这些变量来预测结果。 设置导包: iaport pandas as pdi*port numpy as np import matplotlib. pyplot as pit加载数据并存储在数据帧df中: path = '. us-geo. objectstorage, sof11ayer. net/cf-courses-data/CognitiveC1ass/DAO 1011 df = pd. read_csv (path)df. h
2、ead() normalized- symbohng(osses make aspiration num- of- doors bodystyle drivewheels enginelocation wheelbase idcom length ... 0 3 122 atfa- romero std two convertible rwd front 88.6 0.811148 ... 1 3 122 atfa- romero std tv/o convertible rv/d front 88.6 081114
3、8 ... 2 1 122 atfa- romero std two hatchback rwd front 94.5 0.822681 ... 3 2 164 audi std four sedan fwd front 99.8 0.848630 ... 4 2 164 audi std four sedan 4wd front 99.4 0.848630 ... 5 rows x 29 columns < 1 1•线性回归和多元线性回归 线性回归我们将使用的数据模型的一个例子是
4、简单线性回归20000 这个图告诉了我们什么? 从这个残差图中我们可以看出残差并不是随机分布 在X轴上的,这使得我们认为也许非线性模型更适合 这个数据。 多元线性回归我们如何可视化一个多元线性回归模型?这就有点复 杂了,因为你无法用回归图或残差图来表示它。 查看模型的一种方法是查看分布图:我们可以查看模 型得出的拟合值的分布,并将其与实际值的分布进行 比较。 首先让我们做一个预测Y_hat = Im.predict(Z) pit.figure(figsize=(width, height))axl = sns. distplot(df[ price ], hist=Fals
5、e, color="r”, label=wActual Value") sns. distplot(Yhat, hist=False, color="b”, label= 'Fitted Values” , ax=axl) pit. title(5 Actual vs Fitted Values for Price')pit. xlabel(' Price (in dollars)) pit. ylabel(* Proportion of Cars')pit. show()•:已无成之元 pit.close ()Actual vs Fitted Values for Pnce 0 00
6、008 0 00008 0 00007 0 00006 0 00005 0 00004 0 00003 0 00002 000001 Actual Value Fitted Values jo UQgdoJd -10000 loooo 30000 40000 20000 Pnce (in dollars) 我们可以看到,拟合值与实际值相当接近,因为这两 个分布有一些重叠。但是,肯定还有改进的余地。 3 .多项式回归与管道多项式回归是一般线性回归模型或多元线性回归模 型的特例。 我们通过平方或设置自变量的高阶项来得到非线性 关系。 多项式回归有
7、不同的阶数: Quadratic - 2nd orderYhat = a + b\X2 + b2X2 Cubic - 3rd orderYhal = d + />|X2 + 与+ 如 X' Higher order: Y = a + b[X2^b2X2 + b3X3.... /我们在前面己经看到,当使用highway-mpg作为预测 变量时,线性模型并不能提供最佳的拟合。让我们看看是否可以试着用多项式模型来拟合数据。 我们将使用以下函数来绘制数据: def PlotPolly(model, independent_variab1e, dependent_variabble, Na
8、me): x_new = np. linspace(15, 55, 100) y_new = model(x_new)pit. plot(independent_variable, dependent_variabb1e, '. ', x_new, y_new, pit. title C Polynomial Fit with Matplotlib for Price ~ Length*) ax = pit. gca() ax. set_facecolor((0. 898, 0.898, 0.898))fig = pit.gcf0 pit. xlabel(Name)pit.ylabelCP
9、rice of Cars') pit. show() pit.close() 让我们得到变量•:己砌"・ •:己砌"・ x = df [' highway-mpg,] y = df [' price']先用函数polyfit拟合多项式,再用函数polyld来表 示多项式函数。 f = np. polyfit(x, y, 3) p = np.polyld(f) print(p)32 -1.557 x + 204. 8 x - 8965 x + 1. 379e+05我们来画一下函数 PlotPolly(p, x, y, 'highway-mpg') Polynomial Frt
10、with Matplothb for Price ~ Length4SOOO 4SOOO 40000 - 3SOOO 30000 - 2SOOO - 20000 ■ 15000 ■ 10000 - 40000 - 3SOOO 30000 - 2SOOO - 20000 ■ 15000 ■ 10000 - 1520 2S 455055 30 3S i rvghway-mpg np. polyfit (x, y, 3) np. polyfit (x, y, 3) array([-1. 55663829e+00, array([-1. 55
11、663829e+00, 2.04754306e+02, -8.96543312e+03,1. 37923594e+05]) 从图中我们可以看出,这个多项式模型比线性模型表 现得更好。这是因为生成的多项式函数“命中”了更多 的数据点。 用上面的变量x和y创建11阶多项式模型 fl = np. polyfit(x, y, 11) pl = np.polyld(f1) print(p) PlotPolly(pl, x,y, 'Highway MPG') 32 -1. 557 x + 204.8 x - 8965 x + 1.379e+05 Z 20000 Z 20000
12、 Polynomial Fit with Matplothb for Price ~ Length 50000 40000 30000 10000 0 -10000 -20000 多元多项式函数的解析表达式比较复杂。例如,含有 两个变量的二阶多项式(次数二2)的表达式为: Yhai = 〃 +饥X| + />2X2 +如X|X2 +如X: +如X项弋无极乙土我们可以对多个特征进行多项式变换。首先导入模块: fron sklearn. preprocessing iaport P0lynomialFeatures我们创建一个2次多项式特征模型: pr=Polynomia
13、lFeatures (degree=2)无吸之才1 Pr PolynomialFeatures(degree=2, include_bias=True, interaction_only=False)Z_pr=pr.fit_transform(Z) 原始数据是201个样本和4个特征 Z. shape(201, 4) 改造后共201个样本,15个特征 Z_pr. shape (201, 15)管道 数据管道简化了处理数据的步骤。我们使用模块管道 来创建管道。我们还使用StandardScaler作为管道中 的一个步骤。 from sklearn.pipeline inport
14、Pipeline亓成>才froM sklearn. preprocessing inport StandardScaler 我们创建管道,通过创建一个元组列表,其中包含模 型或评估函数的名称及其相应的构造函数。 Input= [ C scale', Standards cal er ()), ('polynomial', PolynomialFeatures (include_bias=False)), (' me我们将序列作为管道构造函数的参数输入 pipe=Pipeline (Input)•: PipePipeline (jnemory=None, steps=[(* scale
15、 StandardScaler(copy=True, with_Bean=True, vith_std=True)), C p- as=False, interaction_only=False)), ('mochi', LinearRegression(copy_X=True, fit_inte: 我们可以对数据进行归一化,同时进行转换和模型拟口。 pipe, fit (Z, y)Pipeline (memory=None, steps= [('scale', StandardScaler (copy=True, with_inean=True, with_std=True)),
16、'polynomial', nclude_bias=False, interaction_only=False)), ('model', LinearRegression(copy_X=True, fit_interc< alse))])类似地,我们可以对数据进行规范化,同时执行转换 和生成预测ypipe=pipe.predict(Z) ypipe [0:4]array([13102. 74784201, 13102.74784201, 18225. 54572197, 10390.29636555]) 4. 样本内评估在评估我们的模型时,我们不仅想要可视化结果,而 且还想要一个定量
17、度量来确定模型的准确性。 在统计中经常用来确定模型准确性的两个非常重要的测量方法是: ・ RA2 / R-squared • Mean Squared Error (MSE)七无《会才R-squared 也称为决定系数,是一种表明数据与拟合的回归线有 多接近的量度。 r平方的值是应变量(y)的变化百分比。 Mean Squared Error (MSE)均方误差测量误差的平方的平均值,也就是实际值(y) 和预测值(?)的差的平方的平均值。 模型1:简单线性回归我们来计算RA2 lm. fit (X, Y)printThe R-square is:lm. score(X, Y))
18、 可以说,约49.659%的价格变动是由这个简单的线性 模型 “horsepower_fit”解释的。 我们来计算MSE“Yhat”使用predict方法,其中X为输入变量: Yhat=lm. predict (X). 夕才print (' The output of the first four predicted value is:Yiiaffd?幻3 The output of the first four predicted value is: [16236.50464347 16236.50464347 17058.238021 让我们从模块指标中导入函数mean_squa
19、red_error fron sklearn. metrics import mean_squared_error我们将预测结果与实际结果进行了比较 mse = mean_squared_error (df [' price,], Yhat)方根print (? The mean square error of price and predicted value fs: "*7 mse) The mean square error of price and predicted value is: 31635042.944639895模型2:多元线性回归 我们来计算RA2lm. fit (
20、Z, df['price']) print C The R-square is: lm.score(Z, df f price' ])) The R-square is: 0.8093562806577457我们可以说,约80.896%的价格变动是由这种多元线 性回归“多元拟合''来解释的。 我们来计算MSE我们做出预测 Y_p r e di ct_mult if it = lm. predict(Z)我们将预测结果与实际结果进行了比较 print C The mean square error of price and predicted value using mull史访巳浪
21、之,j \ mean_squared_error(df[ price*], Y_p r e di ct_mult if it)) The mean square error of price and predicted value using multifit is: 11980366.87072649模型3:多项式拟合 我们来计算RQ让我们从模块中导入函数r2_score,因为我们使用的 是另一个函数fro> sklearn. metrics i*port r2_score 我们应用这个函数来得到M2的值r_squared = r2_score(y, p(x)) print('Th
22、e R-square value is:r squared) 我们可以说,约67.419%的价格变化是由这个多项式 拟合解释的。 MSE我们还可以计算MSE: mean_squared_error(df['price' ], p(x))20474146.426361218 5. 预测和决策预测 在前一节中,我们使用fit方法对模型进行了训练。现 在,我们将使用predict来生成一个预测。导入pyplot 进行绘图;我们还将使用numpy中的一些函数。 import matplotlib. pyplot as pitimport numpy as np '为 matplot li
23、b inline创建一个新输入 new_input=np.arange(1, 100, 1). reshape(-1, 1)拟合模型 Im. fit (X,Y).:色 湖以Im LinearRegression(copy_X=True, fit_intereept=True, n_jobs=l, normalize=False)产生一个预测 yhat=lm. predict (new_input).:户<yhat[0:5] array ([37601. 57247984, 36779. 83910151, 35958. 10572319, 35136. 372睥8砌之尤34314.6
24、3896655]) 我们可以绘制数据 简单线性回归是一种帮助我们理解两个变量之间关 系的方法: 1. 预测因子/自变量(X)我们要预测的响应/因变量(Y) 线性回归的结果是一个线性函数,它将响应(因变量) 作为预测(自变量)的函数来预测。 Y : Response VariableX : Predictor Variables "-无 线性函数: Yhal =,+ bX匕无如分La为回归直线0的截距,即X = 0时Y的值 2.b为回归线的斜率,即X增加1个单位时Y的变化值让我们加载线性回归的模块 f ron skiearn. linear_model import Linear
25、Regression创建线性回归模型 Im = LinearRegression()午粉玄Im LinearRegression(copy_X=True, fit_intereept= True, n_jobs=l, normalize=False)highway-mpg如何帮助我们预测汽车价格? 对于这个例子,我们想看看highway-mpg如何帮助我 们预测汽车价格。使用简单的线性回归,我们将创建 一个线性函数,“highway-mpg”作为预测变量,“price” 作为响应变量。 X = df [['highway-mpg']]•说 无反之尤Y = df [' price']
26、pit. plot (new_input, yhat) pit. show() 决策制定:确定一个合适的模型现在我们已经可视化了不同的模型,并生成了拟合的 I•平方和MSE值,那么我们如何确定一个良好的模型 拟合呢? 什么是好的RA2? 当比较模型时,RA2越高的模型对数据的拟合越好。 什么是好的MSE? 在比较模型时,MSE值最小的模型更适合数据。 让我们看看不同模型的值简单线性回归:使用highway-mpg作为价格的预测变 量: •>c,无族片 ・ ・ MSE: 3.16x10』多元线性回归:使用horsepower, curb-weight
27、 engine-size, highway-mpg作为预测变量的价格: • R-squared: 0 80896354913783497 ・MSE: 1.2x10A7挺.无如才多项式拟合:使用highway-mpg作为预测变量的价格: • .MSE: 2.05x10A7简单线性回归模型(SLR)与多元线性回归模型 (MLR)的比较 通常,你拥有的变量越多,你的模型在预测方面就越 好,但这并不总是正确的。有时你可能没有足够的数 据,你可能会遇到数字问题,或许多变量可能没有用, 甚至作为噪音。因此,你应该经常检查MSE和R¥。 因此,为了能够比较MLR和SLR模型的结果,我们 观察了
28、RA2和MSE的组合,从而得出关于模型拟合 度的最佳结论。 MSE: SLR 的 MSE 是 3.16xlOA7,而 MLR 的 MSE 是 1.2 xlOA7o MLR的MSE要小得多。 RA2:在这种情况下,我们还可以看到SLR的M2和MLR 的M2之间有一个很大的区别。SLR的RA2(〜0.497)与MLR 的"2(〜0.809)相比非常小。 这个RA2结合MSE表明,与SLR相比,MLR似乎是 更适合这种情况的模型。 简单线性模型(SLR)与多项式拟合的比较MSE:我们可以看到多项式拟合降低了 MSE,因为这 个 MSE比来自SLR的MSE要小。 RA2:多项式拟合的RA2比
29、SLR的RA2大,多项式拟 合也使RV增加了不少。 由于多项式拟合导致较低的MSE和较高的RV,我们 可以得出结论,这是一个比简单的线性回归预测价格 与highway-mpg作为预测变量更好的拟合模型。 多元线性回归(MLR)与多项式拟合的比较结论: 比较这三种模型,我们得出结论,MLR模型是能够从 我们的数据集预测价格的最佳模型。这个结果是有意 义的,因为我们总共有27个变量,我们知道这些变 量中有多个是最终汽车价格的潜在预测因素。 阅读12 使用highway-mpg拟合线性模型lm. fit (X,Y) LinearRegression(copy_X=True, fit_in
30、tercept=True, n_jobs=l, normalize=False)我们可以输出一个预测 无必it Yhat=lm.predict(X)Yhat [0:5] array ([16236. 50464347, 16236. 50464347, 17058. 23802179, 13771. 30'.*8井矿;7才20345.17153508]) 截距a是多少? lm.intercept. 38423.305858157386斜率b是多少? lm. coef array([-821. 73337832])我们最终得到的估计线性模型是什么? 正如我们上面看到的,我们应该
31、得到一个最终的线性模型的结构: Yhat =。+ bX代入我们得到的实际值: price = 38423.31 - 821.73 x highway-mpg多元线性回归 如果我们要使用多个变量来预测汽车价格,该怎么办? 如果我们想在模型中使用更多的变量来预测汽车价 格,我们可以使用多元线性回归。多元线性回归与简 单线性回归非常相似,但该方法用于解释一个连续响 应(因变量)与两个或多个预测(自变量)之间的关系。大 多数实际的回归模型都涉及多个预测因子。我们将用 四个预测变量来说明这个结构,但是这些结论可以推 广到任何整数: Y : Response VariableX\ : Predi
32、ctor Variable 1 %2 : Predictor Variable 2X3 : Predictor Variable 3 : Predictor Variable 4无洗5a : intercept b\ : coefficients of Variable I处:coefficients of Variable 2 : coefficients of Variable 3 如:coefficients of Variable 4 '一 无阪才Yfuit =。+ 饥X| + 旅 X? + 0X3 + />4X4 从上一节我们知道,其他好的价格预测指标可能是: • Hor
33、sepower • Curb-weight • Engine-size . Highv/ay-mpg/ 无次豚让我们开发一个使用这些变量作为预测变量的模型 Z = df[[' horsepower', ' curb-weight', ' engine-size', ' highwaysmpg1 ]]利用上述四个变量拟合线性模型 Im. fit (Z, df['price'])LinearRegression(copy_X=True, fit_intereept= True, n_jobs=l, normalize=False) 截距a是多少? lm. intercept_-158
34、06.624626329198 系数(bl b2 b3 b4)是多少? lm. coef_array([53. 49574423, 4.70770099, 81. 53026382, 36.05748882]) 我们最终得到的估计线性模型是什么? 正如我们上面看到的,我们应该得到一个最终的线性函数的结构: Yfuit = a + b\X\ + />2X2 + 0X3 + bqX4在这个例子中我们得到的线性函数是什么? Price = -15678.742628061467 + 52.65851272 x horsepower + 4.69878948 x curb-weight +
35、 81 95906216 x engine-si;2.用可视化来评估模型 现在我们己经开发了一些模型,我们如何评估我们的模型,如何选择最好的模型?一种方法是使用可视化。 导入可视化包:seabornimport seaborn as sns、云.沮住之宗 %matplotlib inline绘制回归模型 当涉及到简单的线性回UI时,•个可视化我们模型的好方法是使用回归图。 此图将显示数据点(散点图)的组合,以及贯穿数据的 拟合线。这将给我们一个关于变量之间的关系,相关 的强度,以及方向(正或负相关)的合理估计让我们把马力想象成价格的潜在预测变量: width = 12height
36、 10 pit. figure(figsize=(width, height))sns. regplot (x=A,highways mpg", y= "price', data=df) pit. ylim(0,) (0, 48271.86720854358) 从图中可以看出,价格与highway-mpg呈负相关,因 为回归斜率为负。在查看回归图时要记住的一件事 是,要注意数据点在回归线周围的分散程度。这将为 您提供数据方差的良好指示,以及线性模型是否最适 合。如果数据离直线太远,则此线性模型可能不是此 数据的最佳模型。让我们将此图与“peak-rpm”的回归 图进行比较。 pit
37、figure(figsize=(width, height))sns. regplot (x=,peak-rpm", y= price”, data=df)无由N宗 pit. ylim(0,) (0, 40000 300004500 5500peak-rpm 比较“peak-rpm”和“highway-mpg”的回归曲线,我们发 现“highway-mpg”的点更接近生成的直线,并且平均 下降。“peak.rpirT的点在预测线周围有更多的分布, 而且很难确定这些点是否随着“highway-mpg”的增加 而减少或增加。
38、 残差图将数据的差异可视化的一个好方法是使用残差图。 什么是残差? 观测值(y)与预测值(Yhat)之间的差值称为残差(e),当我们看一个回归图时,残差就是数据点到拟合回归线 的距离。 什么是残差图? 残差图是在垂直的y轴上显示残差,在水平的x轴上 显示自变量的图形。 在查看剩余图时,我们应该注意什么? 如果残差图中的点随机分布在x轴上,则该数据适用于线性模型。这是为什么呢?随机分布残差意味着方 差是常数,因此线性模型很适合该数据。 width = 12height = 10 pit. figure(figsize=(width, height))sns. residplot (df [ highway-mpg' ], df U price ])无成 pit. show()






