版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
在本教程中,您将学习如何构建线性回归模型。这是您在学习机器学习时首先
要做的事情之一,因此它将帮助您迈出进入这个竞争激烈的市场的第一步。
•目录
目录
先决条件
什么是线性回归?
评估指标
R平方
均方根误差
线性回归示例-汽车价格预测模型
导入所需的包:
导入数据集
预处理数据集
如何找到异常值
分析数据集
双变量分析
销售价格与数字特征双变量分析
销售价格与分类特征双变量分析
分类变量编码
相关性分析
如何构建模型
标准化数据集
训练模型
如何评估模型
使用K折交叉验证评估模型
结果可视化
结论
先决条件
1.使用IDE(最好是VSCode)的中等水平经验
2.对PythonNotebookpynb)文件的基本了解
3.对Python编程语言有很好的理解
4.Pandas(处理数据帧)、Numpy、ScikitLearn和Matplot库的基本知识
5.一些统计学知识有助于分析数据
什么是线性回归?
线性回归是一种监督学习方法,其中预测输出本质上是连续的。例如,价格预
测、标记预测等。
线性回归是一种基本的统计和机器学习技术,用于对因变量(也称为目标变量
或响应变量)与一个或多个自变量(预测变量或恃征)之间的关系进行建模。
它的目的是建立一个最能代表这些变量之间关联的线性方程,使我们能够做出
预测并从数据中得出见解。
线性回归的主要目标是找到“最佳拟合”线(或更高维度的超平面),以最小
化预测值和实际观测值之间的差异。
这条最佳拟合线由以下形式的线性方程定义:
Y=b0+blXl+b2X2+...+bnXn
在这个等式中:
1.Y代表我们想要预测的因变量。
2.Xl,X2,...,Xn是自变量或特征。
3.bO是截距(当所有X值均为零时Y的值)。
4.bl,b2,...,bn是确定每个自变量和因变量之间关系的系数。
线性回归假设预测变量和目标变量之间存在线性关系。
该模型的目标是估计系数(bO,bl,...,bn),以最小化训练数据中预测值与实际
值之间的平方差之和。此过程通常称为“拟合模型”。
评估指标
线性回归模型的评估指标是:
1.决定系数或R平方(R2)
2.均方根误差(RSME)
让我们看看它们分别是什么。
R平方
R-Squared描述了开发模型捕获的变化量。它始终介于0和1之间。R平方
的值越高,模型与数据的拟合程度越好。
均方根误差
RMSE测量模型生成的项测值与数据集中的实际观测值之间的误差或残差的平均
大小。它的范围始终在0和正无穷大之间。RMSE值越低表明预测性能越好。
线性回归示例-汽车价格预测模型
在此示例中,我们将尝试通过构建线性回归模型来预测汽车价格。我在Kaggle
中发现了这个问题和数据集。我注意到有一个针对.这个问题的提交,这是完美
的。事实上,我通过采用该解决方案的一部分来为建我的解决方案。
让我们深入探讨这个问题。
我们得到了一个二手车数据集,其中包含汽车名称、年份、售价、当前价格、
行驶公里数、燃料类型、卖家类型、变速箱以及卖家是否是二手车所有者。我
们的目标是预测汽车的售价。
我们来探讨一下解决方案。
导入所需的包:
您将需要各种软件包来解决此问题。以下是导入它们的方法:
importnumpyasnp
importpandasaspd
importmatplotlib.pyplotaspit
importseabornassns
fromsklearn.modelselectionimporttraintestsplit
fromsklearn.preprocessingimportStandardScaler
fromsklearn.linear_modelimportLinearRegression
fromsklearnimportmetrics
fromsklearn.model_selectionimportKI?old
fromsklearn.pipelineimportmakepipeline
fromstatsmodels.stats,diagnosticimportnormal_ad
fromstatsmodels.stats,outliersinfluenceimport
variance_inflation_factor
fromstatsmodels.stats,stattoolsimportdurbin_watson
fromscipyimportstats
导入数据集
可以从我的Gith以存储库下载。
df=pd.read_csv('./cardata,csv')
导入数据集
预处理数据集
下面的代码显示了列及其数据类型和行数。我们的数据集有9列和301行。
df.info()
用于查找数据帧信息的命令,例如列、数据类型、行数等。
<class'pandas.core.frame.DataFrame^
Rangeindex:301个条目,。到300个数据列(共9列
):Column
#非空计数Dtype
0Car_Name301年非空对象
一殍
1301年非空int64
2SeUing_Price301非空float64
3Present_Price301非空float64
4Kms_Driven301年非空int64
5FueLType301年非空对象
6Seller_Type301年非空对象的
7传输301年非空对象
8老板301年非空int64
dtypes:float64(2),int64(3),object⑷内存使用:2L3+
KBCSDN@wly476923083
“CajName”列描述汽车名称。我们的数据集中应忽略该字段。这是因为,只
有汽车的功能才重要,而不是它的名称。
以下代码返回数据集中唯一汽车名称的数量。
df['CajName'].nunique()
Car_Namp查找列中唯一条目的数量
我们的数据集中有98个独特的汽车名称。
df['Car_Name'].nuniquejQ]
yo.os
98
唯一汽车名称的数量
显然,它不会给我们的数据集添加任何意义,因为类别太多。让我们删除该
列。
df.drop(,CajName',axis=l,inplace=True)
删除Car_Name列
该数据集具有名为“Year”的列。理想情况下,我们需要购买/出售汽车的年
份。因此,我们将其转换为“年龄”并删除“年份”歹人
df.insert(0,〃Age〃,df["Year"],max()+1-df["Year"])
df.drop('Year',axis=l,inplace=True)
“车龄”是通过查找数据集中可用的最大年份与恃定汽车年份之间的差异来计
算的。这是因为,我们的计算将特定于该特定时间段和该数据集。
音音讯除济叫。_19“92里类样原fl9VhG_2rn>9)hq_jn9291q9)八口_3所1192锢羊
0册丰出声000V202.22£.£20
0商演舞由深000讣归0己讣9-
0ooea28.eS£.V
商雷聂加丰期献声££
0平工人00£228.£8£
@80££。合讣用胸HQ翻登由滦。讣*V8.d08.424
如何找到异常值
异常值是与其他观察值显着不同的数据点。它们可能会导致模型的性能下降。
四分位间距(IQR)
离群值离群值
“最小值”(Q1-
1.5*IQR)
(第25百分位)(第75百分位)。三卬]^y/ly476923083
分类列的数据类型为“对象”。让我们将数字列和分类列分组到NumPy数组
中。数组中的前5个元素将是数字列,其余3个元素将是分类列。
我们可以使用库在列中绘制数据seaborn。分类列将包含多个条形,而数字列
将包含单个条形。
让我们尝试使用以下代码查找数据集中的异常值:
sns.setstyle('darkgrid')
colors=['#0055ff','#ff7000',,#23bf00,]
CustomPalette=sns.set_palette(sns.color_palette(colors))
OrderedCols=
np.concatenate([df.selectdtypes(exclude='object,).columns,values,
df.selcct_dt)rpcs(include:'object,).columns,values])
fig,ax=pit.subplots(2,4,figsize=(15,T,,dpi=100)
fori,colinenumerate(OrderedCols):
x=i//4
y=i%4
ifi<5:
sns.boxplot;data=df,y=col,ax=ax[x,y])
ax[x,y].yaxis.label.set_size(15)
else:
sns.boxplot;data=df,x=col,y-SellingPrice,,ax=ax[x,y];
ax[x,y].xaxis.label.set_size(15)
ax[x,y].yaxis.label.set_size(15)
pit.tight_layout()
pit.show()
用于查找每列中的异常值并将其绘制为图表的代码
LHG|jAb€JL9U2UJIe2IOU
(MMIOtoH0U9PC
数据集中的异常值确定
让我们尝试使用四分位数范围规则来查找异常值。
这是基于四分位数的概念,将数据集分为四个相等的部分。IQR(四分位数范围
规则)规则特别关注数据中间50%内的值范围,并使用该范围来识别潜在的异
常值。
我们必须找到分类列中每个唯一值的最小和最大分位数值,并过滤掉不适合目
标列(销售价格)第25个和75个百分位的异常值样本。
另一方面,数值列中的异常值可以通过同一列的第25个和第75个百分位数
进行过滤。我们不需要针对目标列进行过滤。
outliers_indexes=[]
target='Selling_Price'
forcolindf.sclect_dtypcs(includc=,object,).columns:
forcatindf[col],unique():
dfl=df[df[col]==cat]
ql=dfl[target].quantile(0.25)
q3=dfl[target],quantile(0.75)
iqr=q3-ql
maximum=q3+(1.5*iqr)
minimum=ql-(1.5*iqr)
outliersamples=dfl[(dfl[target]<minimum)
(dfl[target]>maxinum)]
outliers_indexes.extend(outlier_sanples.index,tolist())
forcolindf.select_dtypes(exclude=,object*).columns:
ql=df[col],quantile(0.25)
q3=df[col].quantile(0.75)
iqr=q3-ql
maximum=q3+5*iqr)
minimum=ql-5*iqr)
outlier_samples=df[(df[col]<minimun)|(df[col]>maximumJ]
outliers_indexes.extend(outlier_samples.index,tolist())
outliers_indexes=list(set(outliers_indexes))
print('{}outlierswereidentified,whoseindices
are:\n\n{}J.format(len(outliers_indexes),outliers_indexes))
显示检测到的异常值的索引的代码
通过运行上面的代码,我们发现数据集中有38个异常值。
【八.加、3rX’W9TK,ha、WWTWQ5'WU'IbVg'WJW*W'TM*TWWS8、8,M*弊'3,82*SQ*«5*WIX'StJ
但请记住,删除异常值并不总是正确的决定。它们可以是合理的观察结果,在
决定是否丢弃异常值之前调查异常值的性质非常重要。
我们可以在两种情况下删除异常值:
1.异常值是由于错误输入或测量的数据造成的
2.异常值产生显着关联
让我们进一步挖掘并找到完美的异常值。
为此,我们假设如果售价超过330万卢比,或者汽车的行驶里程超过40万公
里,那么这些都是异常值。我们将它们标记为绿色。保存变量中的所有索引
removing_indiceso使用库以散点图格式绘制它们seaborn,将每列与我们的
目标列进行比较。
#OutliersLabeling
df1=df.copy()
dfl['label']='Nornal'
dfl.loc[outliers_indexes,Jlabel*]='Outlier'
#RemovingOutliers
removing_indexes=[]
removing_indexes.extend(dfl[dfl[target]>33].index)
removing_indexes.extend(dfl[dfl['Kms_Driven,]>400000].index)
dfl.loctremovingindexes,?labeT]='Removing'
#Plot
target='Selling_Price'
features=df.columns,drop(target)
colors=['#0055ff','#Ff7000','#23bf00']
CustomPalette=sns.set_palette(sns.color_palette(colors))
fig,ax=pit.subplots(nrows=3,ncols=3,figsize=(15,12),dpi=200)
foriinrange(len(features)):
x=i//3
y=i%3
sns.scatterplot;data=df1,x=featurcs[i],y=target,hue='label',
ax=ax[x,y])
ax[x,y].set_title(,{}vs.{}y.format(target,features[i]),size二
15)
ax[x,y].setxlabel(features[i],size=12)
ax[x,y].set_ylabel(target,size=12)
ax[x,y].grid()
ax[2,1].axis('off')
ax[2,2].axisCoff')
pit.tight_layout()
plt.show()
用绿色绘制最佳异常值的代码
销售价格与年龄卖价VS现价
•ixn
■
HHi:;
01000002000003COOOO零400000500000
年龄Rre$e<*.FTkeKna.DvMn
SellingPricevs.Fuel.TypeSellmg_Pricev».Seller_Type售价vs.传输
35・
•眯篇
个人
僧枷党
Fud.TypeSeller_Type@7/1y4769233
异常值用绿色标出
让我们看看完美的异常值:
removing_indexes=list(set(rcmoving_indexes))
removing_indexes
列出最佳异常值的代码
removing_indexes=list(set(removing_indexes))
removing_indexes|
\Z0.0s
[196,86]
原始异常值指数列表
我们有2个。我们必须删除它们。但在此之前,我们必须检查数据集中是否存
在空数据。
df.isnull().sum()
杳找每列中空条目的数量
我们的数据集中没有空值。
df.isnull().sum()
Age0
Selling_Price0
Present_Price0
Kms_Driven0
Fuel_Type0
Seller_TypeO
Transmission0
Owner0
dtype:int64
数据集中没有空值
让我们删除已识别的异常值并重置数据帧的索引。
dfl=df.copy()
df1.drop(removing_indexes,inplace二True)
dfl.reset.index(drop=True,inplace=True)
从数据框中删除异常值
分析数据集
让我们分析一下数据,看看每个字段/类别与汽车的售价有多少相关性。我们需
要对我们的数据集进行一些分析才能得出一些结论。
为此,我们必须识别数据集中的数值和分类字段,因为每种类型的绘制方法都
不同。
NumCols=['Age',JSelling_Price,,,Present_Price,,'Kms_Driven',
'Owner)]
CatCols=fFuelJEype*,,Seller_Type,,'Transmission']
数字和分类列的列表
双变量分析
如果您不熟悉什么是双变量分析,这里有一个基本定义:
双变量分析是最简单的定量分析形式之一。它涉及对两个变量的分析,以确定
它们之间的经验关系。双变量分析有助于检验简单的关联假设。
让我们使用双变量分析将销售价格与其他列进行比较,并尝试从该数据中得出
一些结论。
销售价格与数字特征双变量分析
让我们使用双变量分析将数值特征与销售价格进行比较。数值列将绘制在散点
图中。
fig,ax=pit.subplots(nrows=2,ncols=2,figsize=(10,10),dpi=90)
num_features=Present_Price,,,Kms_Driven,,'Age','Owner']
target='SellingPrice'
c='#0055fF
foriinrange(len(numfeatures)):
row=i//2
col=i%2
ax[row,col],scatter(dfl[num_features[i]],df1[target],color=c,
edgecolors='w',1inewidths=O.25)
ax[row,col].set_title(,{}vs.{}j.format(target,
num_features[i]),size=12)
ax[row,col].set_xlabel(num_features[i],size=12)
ax[row,col].set_ylabel(target,size=12)
ax[row,col].gridO
pit.suptitle(,SeilingPricevs.NumericalFeatures',size二20)
pit.tight_layout()
pit.show0
数值列与售价的比较
销售价格vs.数字特征
Selling_Pricevs.Kms_Driven
50
25
20
尤
斯15
10
2.02.53.0
销售价格与数字特征双变量分析
销售价格与分类特征双变量分析
让我们使用双变量分析将分类特征与销售价格进行比较。分类列将绘制在带状
图中。这给出了类别中多个值之间的比较。
fig,axes=pit.subplots(nrows=l,ncols=3,figsize=(12,5),dpi=100)
cat_features=fFuel_Type,,JSeller_Type,,'Transmission']
target=*Selling_Price,
c='#0055ff'
foriinrange(len(catfeatures)):
sns.stripplot(ax=axes[i],x=cat_features[i],y=target,data=dfl,
size=6,color=c)
axes[i],set_titleC(}vs.{}J.format(target,cat_features[i]),
size=13)
axes[i].set_xlabel(cat_features[i],size=12)
axes[i].set_ylabel(target,size二12)
axes[i].grid()
pit.suptitle(,SellingPricevs.CategoricalFeatures,,size=20)
pit.tight」ayout()
pit.show()
分类列与售价的比较
销售价格vs.分类特征
Selling_Pricevs.Fuel.TypeSelling_Pricevs.Seller_Type售价vs.传输
柴油CNG个人手澧自动
Fuel_TypeSeller_Type销&;^ly476923083
销售价格与分类特征双变量分析
以下是我们从数据分析中可以得出的结论:
1.随着现价上涨,售价也会上涨。它们是成正比的。
2.销售价格与行驶公里数成反比。
3.售价与汽车的车龄成反比。
4.随着旧车拥有者数量的增加,其售价会下降。所以售价与所有者成反比。
5.就售价而言,柴油车〉CNG汽车>汽油车。
6.个人销售汽车的销售价格低于经销商销售汽车的价格。
7.自动挡汽车比手动挡汽车贵。
分类变量编码
我们不能按原样使用分类字段。它们必须转换为数字,因为机器只能理解数
字。
我们以“燃料”列为例。根据我们的数据集,我们的汽车使用两种燃料。它们
是汽油和柴油。分类变量编码会将燃料列分为2列(Fuel_Type_Pelrol和
Fuel_Type_Diesel)。
假设一辆汽车使用汽油。对于此汽车,数据将转爽为Fuel_Type_Petrol列设
置为1(True),Fuel_Type_Diesel列设置为0(False)o计算机可以理解1
和0,而不是“汽油”和“柴油”。
为此,我们将对分类列执行one-hot编码。Pandas提供了getdummies对列
进行编码的方法。
CatCols=['Fuel_Type','Seller_Type','Transmission']
df1=pd.get_dummies(df1,columns二CatCols,dropfirst=True)
dfl.head(5)
对分类列进行One-Hot编码
q2<eoe-8i旧200的堂&"DM'2,须30修
3858225000喀目堂ZEBd
*腮基
55rs2雁eaoo0旭HlEBa厚腮
望堂
1e似«ooo0MEW陪喀腮
02332299510000宿MZEB3Y丕骷
出弋26||!U?-bqC6bl626urt>UC6<UJ?-DUA6U(JMUGlEn6FiAb6-D!G2G|tnq-iAbG-bGHOi26j[6「iAb6-|uq网qng【ii9u?ujR2iou-w9un9|
分类变量编码
假设True和分别False是0和。1
相关性分析
相关矩阵是总结数据集中变量对之间线性关系的强度和方向的矩阵。它是统计
和数据分析中的重要工具,用于检查变量之间的关联模式并了解它们如何相
关。
如果值为正,则相关性为正比;如果值为负,则相关性为反比。
这是查找与销售价格相关的相关矩阵的代码。
target=JSellingPrice'
cmap=sns.diverging_palette(125,28,s=100,1=65,sep=50,
ascmap=True)
fig,ax=pit.subplots(figsize=(9,8),dpi=80)
ax=sns.heatmap(pd.concat([dfl.drop(target,axis=l),
dfl[target]],axis=l\corr(),annot=True,cnap=cmap)
pit.show()
绘制相关矩阵
100
I
Age00140620194)071006600350015-028
H-075
R-esent_Phce00141034001605-049059-045008
-050
Kms_Driven0.6203410.130.260260210.0870.063
Owner0190016013005300550130052-0091-025
fuel_iype_Diesel-007105026-00531-098-035-011055-000
Fuel_*Type_Petrol0.066-O.4S-0.26OOSS09810360.1-O.S4
--025
Seller-lypejndividual0035059-021013-03503610077■057
.r50
iransmission^Manual0015■04500870052-0110100771■041
-075
Selling-Price0280880.063-0.0910.55-0.54■0.57-0.411
o一
第tns
Oou
yxq£
M2
JIQ
dUu
三
汾3
.S2
,S
V.
a
j
s
I2u
c
u
相关矩阵
从上面的矩阵中,我们可以推断出目标变量“销售价格”与当前价格、卖家类
型和燃料类型高度相关。
如何构建模型
我们已经到了最后阶段。让我们训练和测试我们的模型。
让我们从输入中删除“Selling_Price”并将其设置为输出。这意味着它必须被
预测。
X=dfl.drop(,Selling_Price,,axis=l)
y=dflfSellingPrice*]
将输入和输出(销售价格)拆分为单独的数据帧
让我们分割数据集,将70%的数据用于训练,30%的数据用于测试。
X_train,X_test,y_train,y_test=train_test_split(X,y,
test_size=O.3,random_state=0)
将原始数据集拆分为测试数据集和训练数据集
让我们备份我们的测试数据。我们需要这个来进行最终比较。
y_test_actual=y_test
拥有原始输出的副本
标准化数据集
这StandardScaler是机器学习和数据分析中常用的一种预处理技术,用于标准
化或规范化数据集的特征(变量)。其主要目的是转换数据,使每个特征的平
均值为0,标准差为lo
让我们使用标准化我们的数据集StandardScalero
scaler=StandardScaler()
scaler,fit(X_train)
X_train_scaled=scaler,transform(X_train)
X_test_scaled=scaler,transform(Xtest)
标准化输入数据集
非常重要的是,StandardScaler变换只能从训练集中获得,否则会导致数据泄
漏。
训练模型
linear_reg=LinearRegression()
linear_reg.fit(Xtrainscaled,ytrain)
训练模型
让我们找到训练数据集中每列的截距和系数。
pd.DataFrame(data二np.append(linearreg.intercept,
linear_reg.coef_),index=fIntercept)]+[col+/zCoef.z,forcolin
X.columns],columns4'Value']).sort_values:'Value,,ascending=False)
求斜率和截距
Value
Intercept4.302488
Present_PriceCoef.3.492729
Fuel_Type_DieselCoef.0.850217
Fuel.Type.PetrolCoef.0.207319
Transmission_ManualCoef.0.027375
OwnerCoef.-0.232722
Seller.TypeJndividualCoef.-0.377334
Kms-DrivenCoef.-0.589672
AgeCoef.-0.936339
斜率和截距值
如何评估模型
ScikitLearn提供了韦标功能,可以帮助我们衡量模型的指标。我们可以用它
来确定指标,包括均方误差、平均绝对误差、均方根误差和R2分数。
现在是时候评估模型了:
defmodelevaluation(model,Xtest,ytest,modelname):
y_pred=model,predict(X_test)
MAE=metrics.mean_absolute_error(y_test,y_pred)
MSE=metrics.mean_squared_error(y_test,y_pred)
RMSE=np.sqrt(MSE)
R2_Score=metrics.r2_score(y_test,y_pred)
returnpd.DataFrame([MAE,MSE,RMSE,R2_Score],ind
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《电线电缆产品质量监督抽查实施细则(2026年版)》
- 通知更换部门办公区域使用新会议室事宜通知函6篇范文
- 安排员工健康体检事项通知函(8篇范文)
- 筑牢宿舍安全警惕用电防火隐患,小学主题班会课件
- CCU护理人文关怀实践案例
- 公共场所紧急逃生疏散方案
- 传统文化传承经典魅力绽放小学主题班会课件
- 2026年宁波市镇海区事业单位人员招聘考试参考题库及答案详解
- 2026年郑州市上街区事业单位人员招聘考试参考试题及答案详解
- 坠积性肺炎患者的呼吸功能锻炼指导
- 2025年新媒体运营师考试试题及答案
- 2024年临沂市技师学院招聘教师真题
- 2024北京西城区四年级(下)期末语文试题及答案
- 学科教学中渗透心理健康教育的策略研究
- 养老中心招聘试题及答案
- 电路分析基础(第4版) 课件 第11章 耦合电感电路
- 2025年华侨港澳台学生联招考试英语试卷试题(含答案详解)
- 人教版语文四年级上册教案全册表格式模板
- 常见经济犯罪预防知到智慧树章节测试课后答案2024年秋中国人民公安大学
- GB/T 44957-2024人工影响天气作业点防雷技术规范
- 工程流体力学课后习题答案-(杜广生)学习资料
评论
0/150
提交评论