python线性回归实验.docx

上传人:b****5 文档编号:8124462 上传时间:2023-01-29 格式:DOCX 页数:9 大小:198.13KB
下载 相关 举报
python线性回归实验.docx_第1页
第1页 / 共9页
python线性回归实验.docx_第2页
第2页 / 共9页
python线性回归实验.docx_第3页
第3页 / 共9页
python线性回归实验.docx_第4页
第4页 / 共9页
python线性回归实验.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

python线性回归实验.docx

《python线性回归实验.docx》由会员分享,可在线阅读,更多相关《python线性回归实验.docx(9页珍藏版)》请在冰豆网上搜索。

python线性回归实验.docx

python线性回归实验

实验算法python线性回归实验

【实验名称】

Python线性回归实验

【实验要求】

掌握Python线性回归模型应用过程,根据模型要求进行数据预处理,建模,评价与应用;

【背景描述】

线性回归是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,运用十分广泛。

其表达形式为y=w'x+e,e为误差服从均值为0的正态分布。

【知识准备】

了解线性回归模型的使用场景,数据标准。

了解Python/Spark数据处理一般方法。

了解spark模型调用,训练以及应用方法

【实验设备】

Windows或Linux操作系统的计算机。

部署Python,本实验提供centos6.8环境。

【实验说明】

采用成绩数据集作为算法数据,对模型进行训练和回归。

【实验环境】

Pyrhon3.X,实验在命令行python中进行,或者把代码写在py脚本,由于本次为实验,以学习模型为主,所以在命令行中逐步执行代码,以便更加清晰地了解整个建模流程。

【实验步骤】

第一步:

启动python:

命令行键入python,启动python终端

第二步:

导入用到的包,并读取数据:

(1).导入包:

importnumpyasnp

importpandasaspd

importstatsmodels.formula.apiassmf

importscipy

(2).读取数据并随机打乱,文件路径为:

/opt/algorithm/scoreset/scoregather.txt

df=pd.read_csv("/opt/algorithm/scoreset/scoregather.txt",index_col=0,header=0).sample(frac=1)

(3).展示数据

df.head()

第三步:

数据预处理

说明,数据集包含25门已修学科,以及一门目标学科

(1).划分训练集,测试集

PP=0.8

df_train=df.iloc[:

int(np.ceil(len(df)*PP))]

df_test=df.iloc[int(np.ceil(len(df)*PP)):

]

(2).数据标准化,获取每列均值,标准差

avg_col=df_train.mean()

td_col=df_train.std()

(3).标准化结果

df_train_norm=(df_train-avg_col)/td_col

df_train_norm.head()

第四步:

特征提取及线性回归模型训练

基于F检验的特征选择

(1).由于建模需要标准化字符串,故需重命名表头

list_columns_to_train=df_train_norm.columns

change_columns=['A'+str(zr+1)forzrinnp.arange(len(list_columns_to_train))]

df_train_norm.columns=change_columns

co=dict(zip(change_columns,list_columns_to_train))

defR_transform(data=[],k=0):

r_L=data[k][k]

shape=np.mat(data).shape

R_t=np.zeros(shape)

foriinnp.arange(shape[0]):

forjinnp.arange(shape[1]):

if(i==k)&(j!

=k):

R_t[i][j]=data[k][j]/r_L

elif(i!

=k)&(j==k):

R_t[i][j]=-1*data[i][k]/r_L

elif(i==k)&(j==k):

R_t[i][j]=1.0/r_L

elif(i!

=k)&(j!

=k):

R_t[i][j]=data[i][j]-data[i][k]*data[k][j]/r_L

returnR_t

defforward_step(data,response="",F_in=0.01,F_out=0.5):

remaining=list(data.columns)

last_drop=""

Vld="mark"

n=len(data)

#因变量选择列

selected=[]

l=len(selected)

#计算相关系数矩阵

corr_R=data.corr()

mark=1

while(mark):

#首次变量选择

ifl!

=(len(data.columns)-1):

r_taget=pd.Series(np.diagonal(np.mat(corr_R)))

r_taget.index=remaining

Vi=corr_R[response]**2/r_taget

Vc=Vi.drop(selected+[response],axis=0).sort_values()[-1]

Vl=Vi.drop(selected+[response],axis=0).sort_values().index[-1]

ifVld==last_drop:

mark=0

elifVld!

=last_drop:

Fi=Vc*(n-l-2)/(r_taget[response]-Vc)

F_test=scipy.stats.f.isf(F_in,1,(n-l-2))

ifFi>F_test:

selected.append(Vl)

l=len(selected)

#协方差矩阵转换

corr_R=pd.DataFrame(R_transform(np.array(corr_R),remaining.index(Vl)))

corr_R.index=data.columns

corr_R.columns=data.columns

ifl>=2:

#考虑剔除变量

foriinnp.arange(len(selected)):

rd_taget=pd.Series(np.diagonal(np.mat(corr_R)))

rd_taget.index=remaining

Vid=corr_R[response]**2/rd_taget

Vcd=Vid[selected].sort_values(ascending=False)[-1]

Vld=Vid[selected].sort_values(ascending=False).index[-1]

Fd=Vcd*(n-(l-1)-2)/rd_taget[response]

F_test_out=scipy.stats.f.isf(F_out,1,(n-(l-1)-2))

if(Fd

selected.remove(Vld)

last_drop=Vld

corr_R=pd.DataFrame(R_transform(np.array(corr_R),remaining.index(Vld)))

corr_R.index=data.columns

corr_R.columns=data.columns

l=len(selected)

else:

mark=0

else:

mark=0

returnselected

select_list=forward_step(df_train_norm,response=change_columns[-1])

select_list=change_columns[:

2]

#线性回归模型训练

formula="{}~{}+1".format(change_columns[-1],'+'.join(select_list))

model=smf.ols(formula,df_train_norm).fit()

print(model.summary())

第五步:

模型预测展示与结果对比

#模型预测展示

#利用训练集的统计信息标准化测试数据

df_test_norm=(df_test-avg_col)/td_col

df_test_norm.columns=change_columns

df_test_norm.head

#模型预测展示

#利用训练集的统计信息标准化测试数据

df_test_norm=(df_test-avg_col)/td_col

df_test_norm.columns=change_columns

#预测结果还原百分制

predict=model.predict(df_test_norm)

predict_df=predict*td_col[-1]+avg_col[-1]

#被选择特征反编码

select_list_old=[co[z]forzinselect_list]

print(predict_df)

print(select_list_old[0]);print(select_list_old[1])

#结果对比

F=pd.DataFrame(df_test["目标学科"]).join(pd.DataFrame(predict_df))

#回归残差,以及结果相关系数

corr=F.corr()["目标学科"][0]

stds=abs(F["目标学科"]-F[0]).sum()/len(F)

#输出程序运行摘要

print("程序选择特征%s,预测结果相关系数is%s,回归残差is%s分"%(",".join(select_list_old),corr,stds))

第六步:

通过以下命令执行python文件,直接查看运行结果

python/opt/algorithm/scoreset/scorexpect.py

【问题与回答】

1、Q:

为什么要进行标准化,而且必须用正规化方法?

A:

线性回归基本假设之一,所有变量必须满足正态分布假设,但在实际操作上,我们一般利用正规化方法让数据近似于正态分布。

在某些情况下,数据实在是呈现出严重的偏态特征,可以选用boxcox方法转换数据,尽量达到线型回归模型的数据要求。

2、Q:

怎么防止线性回归过拟合?

A:

模型过拟合是一个普遍性问题,尤其在特征非常多而样本量却很少的情况下,在实践中,一般通过特征降维以及增加正则化参数的方式共同使用,防止模型过拟合,对于特征过多而且普遍独立的情况下,采用本例的基于F检验特征筛选方法提取变量效果较好,一般的降维方法有主成分分析法,主基底映射法,另外,在模型构建阶段,有向前法,后退法,以及逐步回归法,本例的检验特征提取方法类似于逐步回归法。

数据降维在提高模型精度方面也有贡献,由于某些变量之间存在共线性,会导致模型精度下降,降维是处理共线性的一个有效方法。

在训练上,添加正则化方法,一般用L2范数正则化,使得某些系数值不能过大,提高模型泛化性能。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工作范文 > 行政公文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1