python线性回归实验.docx
- 文档编号:8124462
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:9
- 大小:198.13KB
python线性回归实验.docx
《python线性回归实验.docx》由会员分享,可在线阅读,更多相关《python线性回归实验.docx(9页珍藏版)》请在冰豆网上搜索。
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范数正则化,使得某些系数值不能过大,提高模型泛化性能。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- python 线性 回归 实验
![提示](https://static.bdocx.com/images/bang_tan.gif)