机器学习---多变量的回归问题

简介: 机器学习---多变量的回归问题

多元回归与非线性回归


多元回归:自变量有不止一个,最后来预测一个结果

非线性回归:函数就不是简单的都是一次项,引入了高阶项使函数更能完美拟合得到准确率更高的预测值


首先引入一个学生的身高体重数据集来回顾昨天的一元线性回归


训练集


序号 身高(m) 体重(kg)
1 0.86 12
2 0.96 15
3 1.12 20
4 1.35 35
5 1.55 48
6 1.63 51
7 1.71 59
8 1.78 66

测试集


序号 身高(m) 体重(kg)
1 0.75 10
2 1.08 17
3 1.26 27
4 1.51 41
5 1.6 50
6 1.67 64
7 1.85 75


#先查看身高体重是否存在线性关系
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
from sklearn.preprocessing import PolynomialFeatures
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
def runplt():
    plt.figure()
    plt.title('身高与体重一元关系')
    plt.xlabel('身高')
    plt.ylabel('体重')
    plt.axis([0,2,0,85])
    plt.grid
    return plt
X=[[0.86],[0.96],[1.12],[1.35],[1.55],[1.63],[1.71],[1.78]]
y=[[12],[15],[20],[35],[48],[51],[59],[66]]
plt=runplt()
plt.plot(X,y,'k.')
plt.show()
复制代码


image.png


# 用sklearn的线性模型去拟合
from sklearn.linear_model import LinearRegression
model=LinearRegression()
model.fit(X,y)
#使用身高1.67来进行模型预测
print('预测身高为1.67米的体重为:',model.predict(np.array([1.67]).reshape(-1,1)))
复制代码


预测身高为1.67米的体重为: [[55.75685871]]


#用测试集对模型整体预测
X_test=[[0.75],[1.08],[1.26],[1.51],[1.6],[1.85]]
y_predict=model.predict(X_test)
plt.plot(X,y,'k.')
plt.plot(X_test,y_predict,'g-')
#残差
yr=model.predict(X)
for idx,x in enumerate(X):
    plt.plot([x,x],[y[idx],yr[idx]],'r-')
plt.show()
复制代码


image.png

#对模型评估
y_test=[[10],[17],[27],[41],[50],[75]]
r2=model.score(X_test,y_test)
print("模型的确定系数为:",r2)
复制代码


模型的确定系数为: 0.9252812815771203


进行二元回归分析


使用身高,年龄,体重数据集


训练集


序号 身高(cm) 年龄(岁) 体重(kg)
1 147 9 34
2 129 7 23
3 141 9 25
4 145 11 47
5 142 11 26
6 151 13 46


测试集


序号 身高(cm) 年龄(岁) 体重(kg)
1 149 11 41
2 152 12 37
3 140 8 28
4 138 10 27
5 132 7 21
6 147 10 38


x_train=[[147,9],[129,7],[141,9],[145,11],[142,11],[151,13]]
y_train=[[34],[23],[25],[47],[26],[46]]
model2=LinearRegression()
model2.fit(x_train,y_train)
x_test=[[149,11],[152,12],[140,8],[138,10],[132,7],[147,10]]
Y_test=[[41],[37],[28],[27],[21],[38]]
predictions=model2.predict(x_test)
print("模型2的确定系数为:",model2.score(x_test,Y_test))
for i,prediction in enumerate(predictions):
    print("预测值:{},真实值为{}".format(prediction,Y_test[i]))
复制代码


image.png


plt.title('多元回归实际值与预测值')
plt.plot(Y_test,label='y_test')
plt.plot(predictions,label='predictions')
plt.legend()
plt.show()
复制代码


image.png


对第一个数据集增加二次项实现非线性回归


x1_train=[[0.86],[0.96],[1.12],[1.35],[1.55],[1.63],[1.71],[1.78]]
y1_train=[[12],[15],[20],[35],[48],[51],[59],[66]]
x1_test=[[0.75],[1.08],[1.26],[1.51],[1.6],[1.85]]
y1_test=[[10],[17],[27],[41],[50],[75]]
#显示
plt = runplt()
regressor = LinearRegression()
regressor.fit(x1_train,y1_train)
xx = np.linspace(0,26,100)
yy = regressor.predict(xx.reshape(xx.shape[0],1))
plt.plot(x1_train,y1_train,'k.')
plt.plot(xx,yy)
#构建回归函数,添加二次项
quadratic_fearurizer = PolynomialFeatures(degree=2)
X_train_quadratic = quadratic_fearurizer.fit_transform(x1_train)
X_test_quadratic = quadratic_fearurizer.transform(x1_test)
regressor_quadratic = LinearRegression()
regressor_quadratic.fit(X_train_quadratic,y1_train)
xx_quadratic = quadratic_fearurizer.transform(xx.reshape(xx.shape[0],1))
plt.plot(xx,regressor_quadratic.predict(xx_quadratic),'r-')
plt.show()
print('一元线性回归r^2:%.2f'%regressor.score(x1_test,y1_test))
print('二元线性回归r^2:%.2f'%regressor_quadratic.score(X_test_quadratic,y1_test))


image.png


可以看出引入二次项函数拟合的更好,确定系数也增大了


下面我们做个测试,看看引入更高阶的项看能不能效果更好


k_range = range(2,10)
k_scores = []
regressor = LinearRegression()
regressor.fit(x1_train,y1_train)
k_scores.append(regressor.score(x1_test,y1_test))
for k in k_range:
    k_featurizer = PolynomialFeatures(degree=k)
    x1_train_k = k_featurizer.fit_transform(x1_train)
    x1_test_k = k_featurizer.transform(x1_test)
    regressor_k = LinearRegression()
    regressor_k.fit(x1_train_k,y1_train)
    k_scores.append(regressor_k.score(x1_test_k,y1_test))
for i in range(0,8):
    print('%d项式r^2是%.2f'%(i+1,k_scores[i]))
plt.plot([1,2,3,4,5,6,7,8,9],k_scores)
plt.show()
复制代码


image.png


可以看到并不是越高阶拟合的越准确,因为有可能在训练集上拟合的过于好,导致过拟合最后在测试集上就出现了很差的表现


再来个多元回归的例子


#1.广告和销量的多元分析
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
#导入数据
data=pd.read_csv('./Advertising.csv')
#查看数据
data.info()
data.head()
复制代码


image.png


这是一个广告和产品销量的数据集,TV,radio,newspaper分别代表电视,收音机,报纸三种广告消费,sales代表产品销售量


# 切分训练集和测试集
X=data[['TV','radio','newspaper']]
y=data['sales']
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.4,random_state=1)#训练集测试集6,4分
linreg=LinearRegression()
model=linreg.fit(X_train,y_train)
print("参数为:",model.intercept_)
print("系数为:",model.coef_)
复制代码


image.png


#预测
y_pred=model.predict(X_test)
print("预测值为:",y_pred)


image.png


plt.figure()
plt.plot(range(len(y_pred)),y_pred,'r',label='预测值')
plt.plot(range(len(y_pred)),y_test,'g',label='测试集真实值')
plt.legend(loc="upper right")
plt.xlabel('序号')
plt.ylabel('产品销售')
plt.show()
复制代码


image.png


#计算拟合的均方误差,评估模型
sum_mean=0
for i in range(len(y_pred)):
    sum_mean+=(y_pred[i]-y_test.values[i])**2
sum_err=np.sqrt(sum_mean/len(y_pred))
print("模型的均方根误差为",sum_err)
复制代码


模型的均方根误差为 1.5635772207961516


总结


其实这两次的回归问题都是很简单的入门问题,基本用自己写的简单函数就能实现,关键是要有从多变量转到向量计算的思想,以及对梯度下降的理解。在机器学习,特别是深度学习中,最重要的一种思想就是向量化计算的思想,用向量计算代替传统的循环,可以大大降低计算时间。比如代码中最后计算均方误差就可以用向量计算代替循环计算,只要把y_test用numpy变成ndarray形式就可以接着用向量计算。对于这个思想我昨天看到一个大佬写的博客超赞,大家都可以去看看blog.csdn.net/TeFuirnever…


我最后用到的数据集下载方式


链接:pan.baidu.com/s/1Q7g_4MC8…提取码:o7kl


相关实践学习
使用CLup和iSCSI共享盘快速体验PolarDB for PostgtreSQL
在Clup云管控平台中快速体验创建与管理在iSCSI共享盘上的PolarDB for PostgtreSQL。
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
目录
相关文章
|
4月前
|
机器学习/深度学习 人工智能
【人工智能】<吴恩达-机器学习>多变量线性回归&学习率&特征值
【1月更文挑战第26天】【人工智能】<吴恩达-机器学习>多变量线性回归&学习率&特征值
|
4月前
|
机器学习/深度学习 人工智能
【人工智能】<吴恩达-机器学习>单变量的线性回归&认识梯度下降
【1月更文挑战第26天】【人工智能】<吴恩达-机器学习>单变量的线性回归&认识梯度下降
|
9月前
|
机器学习/深度学习 数据采集 算法
高分SCI必备:使用R语言和机器学习算法解析心脏病中的变量重要性
心脏病是全球范围内主要的致死因素之一[1],给人们的生活和健康带来了巨大的挑战。为了预测和诊断心脏病,研究人员使用了各种机器学习算法,并通过分析变量重要性来理解特征对心脏病的影响。
401 0
|
机器学习/深度学习
【阿旭机器学习实战】【21】通过SVM分类与回归实战案例,对比支持向量机(SVM)3种SVM不同核函数
【阿旭机器学习实战】【21】通过SVM分类与回归实战案例,对比支持向量机(SVM)3种SVM不同核函数
【阿旭机器学习实战】【21】通过SVM分类与回归实战案例,对比支持向量机(SVM)3种SVM不同核函数
|
机器学习/深度学习 算法 数据可视化
机器学习的四个分支及分类回归常用术语解释
机器学习的四个分支及分类回归常用术语解释
|
11月前
|
机器学习/深度学习 算法
【吴恩达机器学习笔记】四、多变量线性回归
【吴恩达机器学习笔记】四、多变量线性回归
72 0
|
机器学习/深度学习 算法
入坑机器学习:五,多变量线性回归
我们开始随机选择一系列的参数值,计算所有的预测结果后,再给所有的参数一个新的值,如此循环直到收敛。
166 0
入坑机器学习:五,多变量线性回归
|
机器学习/深度学习 算法 数据可视化
入坑机器学习:四,单变量线性回归
各类回归模型,例如线性回归、广义线性模型(Generalized Linear Model, GLM)和人工神经网络(Artificial Neural Network, ANN)通过最小化L2或L1损失对其参数进行估计。L2损失和L1损失的不同在于,L2损失通过平方计算放大了估计值和真实值的距离,因此对偏离观测值的输出给予很大的惩罚。此外,L2损失是平滑函数,在求解其优化问题时有利于误差梯度的计算;L1损失对估计值和真实值之差取绝对值,对偏离真实值的输出不敏感,因此在观测中存在异常值时有利于保持模型稳定。
97 0
入坑机器学习:四,单变量线性回归
|
机器学习/深度学习 人工智能
机器学习数学基础四:随机变量和概率论基础
不管是离散型还是连续型,似然函数是一样的,概率表达了在给定参数a时X=x的可能性,而似然函数表示的是在给定样本X=x时参数的可能性。
148 0
机器学习数学基础四:随机变量和概率论基础
|
机器学习/深度学习 人工智能 算法
机器学习之回归
人工智能(AI)长远以来的目标:希望机器可以和人一样聪明。
176 0
机器学习之回归

热门文章

最新文章