机器学习之线性回归

3 篇文章 0 订阅
2 篇文章 0 订阅

线性回归通常是人们再学习预测模型时首选的技术之一,在这种技术中因变量时连续的,自变量可以是连续的也可以时离散的,回归线的性质是线性的。线性回归使用最佳的拟合直线(也就是回归线)再因变量(Y)和一个或多个自变量(x)之间建立一种联系。

简单线性回归(一元线性回归)
from sklearn.linear_model import LinearRegression
导入线性回归模块

rng = np.random.RandomState(1)
xtrain = 10 * rng.rand(30)
ytrain = 8 + 4 *xtrain + rng.rand(30)
#np.random.RandomState 随机数种子,对于一个随机数发生器只要该种子(seed)相同,产生的随机数序列就是相同的
#生成随机数x与y
#样本关系:有= 8 + 4*x

生成散点图
fig = plt.figure(figsize = (12,3))
ax1 = fig.add_subplot(1,2,1)
plt.scatter(xtrain,ytrain,marker = '.',color = 'k')
plt.grid()
![散点图](https://img-blog.csdnimg.cn/20190830103133252.png)
创建线性回归模型
model = LinearRegression()
#不能直接将xtrain带进去,必须先处理成xtrain[:,np.newaxis]
model.fit(xtrain[:,np.newaxis],ytrain)
print(model.coef_)#斜率
print(model.intercept_)#常量

xtest = np.linspace(0,10,1000)
ytest = model.predict(xtest[:,np.newaxis])#预测
ax2 = fig.add_subplot(1,2,2)
plt.scatter(xtrain,ytrain,marker = '.',color = 'k')
plt.plot(xtest,ytest,color = 'r')
plt.grid()
#误差
rng = np.random.RandomState(8)
xtrain = 10 * rng.rand(15)
ytrain = 8 + 4 *xtrain + rng.rand(15)*30
#创建模型
model.fit(xtrain[:,np.newaxis],ytrain)
xtest = np.linspace(0,10,1000)
ytest = model.predict(xtest[:,np.newaxis])

plt.plot(xtest,ytest,color = 'r',linestyle = '--')#拟合直线
plt.scatter(xtrain,ytrain,marker = '.',color = 'k')#样本数据散点图
ytest2 = model.predict(xtrain[:,np.newaxis])#样本数据再拟合直线上的y值
plt.scatter(xtrain,ytest2,marker = 'x',color = 'g')#ytest2散点图
plt.plot([xtrain,xtrain],[ytrain,ytest2],color = 'gray')#误差线
plt.grid()

#多元线性回归
rng = np.random.RandomState(5)
xtrain = 10 * rng.rand(150,4)
ytrain = 20 + np.dot(xtrain,[1.5,2,-4,3]) 
df= pd.DataFrame(xtrain,columns = ['b1','b2','b3','b4'])
df['y'] = ytrain
print(df.head())
pd.plotting.scatter_matrix(df[['b1','b2','b3','b4']],figsize = (10,6),
                          diagonal = 'kde',
                          alpha = 0.5,
                          range_padding = 0.1)
#散点图意义:从散点图看有没相关性,再通过主成分分析筛选出主要数据,然后做多元回归
#创建回归模型
model = LinearRegression()
model.fit(df[['b1','b2','b3','b4']],df['y'])
print('斜率a为:',model.coef_)
print('截距b为:%.4f'%model.intercept_)
print('线性回归函数为:\ny = %.1fx1 + %.1fx2+ %.1fx3+ %.1fx4 + %.1f'
     %(model.coef_[0],model.coef_[1],model.coef_[2],model.coef_[3],model.intercept_))
![多元线性回归](https://img-blog.csdnimg.cn/2019083010325161.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzQxMzcwOQ==,size_16,color_FFFFFF,t_70)
 #模型评价
#创建数据
from sklearn import metrics
rng = np.random.RandomState(1)
xtrain = 10 * rng.rand(30)
ytrain = 8 + 4 * xtrain + rng.rand(30)*3

#多元回归拟合
model = LinearRegression()
model.fit(xtrain[:,np.newaxis],ytrain)

ytest = model.predict(xtrain[:,np.newaxis])
mse = metrics.mean_absolute_error(ytrain,ytest)
rmse = np.sqrt(mse)
print(mse,rmse)

ssr = ((ytest - ytrain.mean())**2).sum()
sst = ((ytrain - ytrain.mean())**2).sum()
r2 = ssr/sst
print(r2)

#求r2另一种方法
r22 = model.score(xtrain[:,np.newaxis],ytrain)
print(r22)#等同于r2

#同一个数据多个模型之间选择:r越接近1越好,mse相对越小越好
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值