【ML】多项式回归

要操作的元数据:
链接:http://pan.baidu.com/s/1jIw1edw
密码:qis4

得到两组数据之间的某种线性关系

==================================================

Python

一些以前操作的说明,不再过多解释。
传送门:http://blog.csdn.net/wiki_su/article/details/78414169

选择好目标文件,然后撸下代码:

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

#import dataset
dataset = pd.read_csv('Position_Salaries.csv')

#生成一个二矩阵
X = dataset.iloc[:,1:2].values
y = dataset.iloc[:,2].values

下面我们先做出线性模型,然后再做出多项线性模型,来进行对比。取出最符合的模型。

#喂养线性回归
from sklearn.linear_model import LinearRegression
line_reg = LinearRegression()
line_reg.fit(X,y)

#线性模型。
plt.scatter(X,y,color = 'red')
plt.title = ('Truth or Bluff(Linear Regression)')
plt.plot(X ,line_reg.predict(X),color = 'blue')
plt.xlabel = ('Position Level')
plt.ylabel = ('Salary')
plt.show()

我们可以看到,这个模型和我们的数据差的实在是太多了。

图1

下面我们看下,多项线性回归。

下面这个是2次的多项线性模型。

#喂养多项线性模型
from sklearn.preprocessing import  PolynomialFeatures
ploy_reg2 = PolynomialFeatures(degree = 2)
X_ploy2 = ploy_reg2.fit_transform(X)
line_reg2 = LinearRegression()
line_reg2.fit(X_ploy2,y)

plt.scatter(X,y,color = 'red')
plt.title = ('Truth or Bluff(Linear Regression)')
plt.plot(X ,line_reg2.predict(ploy_reg2.fit_transform(X)),color = 'blue')
plt.xlabel = ('Position Level')
plt.ylabel = ('Salary')
plt.show()

从结果看出,曲线稍微好些。

图2

我们改为3次方,4次方来看下,

from sklearn.preprocessing import  PolynomialFeatures
ploy_reg3 = PolynomialFeatures(degree = 3)
X_ploy3 = ploy_reg3.fit_transform(X)
line_reg3 = LinearRegression()
line_reg3.fit(X_ploy3,y)


from sklearn.preprocessing import  PolynomialFeatures
ploy_reg4 = PolynomialFeatures(degree = 4)
X_ploy4 = ploy_reg4.fit_transform(X)
line_reg4 = LinearRegression()
line_reg4.fit(X_ploy4,y)

#=================================

plt.scatter(X,y,color = 'red')
plt.title = ('Truth or Bluff(Linear Regression)')
plt.plot(X ,line_reg3.predict(ploy_reg3.fit_transform(X)),color = 'blue')
plt.xlabel = ('Position Level')
plt.ylabel = ('Salary')
plt.show()

plt.scatter(X,y,color = 'red')
plt.title = ('Truth or Bluff(Linear Regression)')
plt.plot(X ,line_reg4.predict(ploy_reg4.fit_transform(X)),color = 'blue')
plt.xlabel = ('Position Level')
plt.ylabel = ('Salary')
plt.show()

我们可以看到,图4这个模型是最吻合的了。

图3

图4

我们看数据X,是 1 - 10,我们把这组数据按照0.1的尺度进行分割。分成90个数据,然后再绘图。

#数据可视化(多项) 分割
x_grid = np.arange(min(X), max(X), 0.1)
x_grid = x_grid.reshape(len(x_grid), 1)


plt.scatter(X,y,color = 'red')
plt.title = ('Truth or Bluff(Linear Regression)')
plt.plot(x_grid ,line_reg4.predict(ploy_reg4.fit_transform(x_grid)),color = 'blue')
plt.xlabel = ('Position Level')
plt.ylabel = ('Salary')
plt.show()

我们对比图4 图5会发现,图5的曲线更加平滑。

图5

比方我们看年限为6.5年的,薪资应该多少。

#做出预测 (单一线性预测)

# array([ 330378.78787879])
line_reg.predict(6.5)  

#做出预测(多项线性预测)

 #array([ 158862.45265153])
line_reg4.predict(ploy_reg4.fit_transform(6.5)) 

==================================================

R

datasets = read.csv('Position_Salaries.csv')
datasets = datasets[2:3]

#设置单一线性回归
line_reg = lm(formula = Salary ~ .,data = datasets)
summary(line_reg)

#设置多项线性回归
datasets$Level2 = datasets$Level^2
datasets$Level3 = datasets$Level^3
datasets$Level4 = datasets$Level^4
poly_reg = lm(formula = Salary ~ .,data = datasets)
summary(poly_reg)


x_grid = seq(min(datasets$Level), max(datasets$Level), 0.1)

#可视化(单一)

#install.packages('ggplot2')
ggplot()+
  geom_point(aes(x = datasets$Level, y = datasets$Salary), colour = 'red')+
  geom_line(aes(x = datasets$Level, y = predict(line_reg, newdata = datasets)),colour = 'blue')+
  ggtitle('Trhth or Burff')+
  xlab('Level')+
  ylab('Salary')


#可视化(多项)
ggplot()+
  geom_point(aes(x = datasets$Level, y = datasets$Salary), colour = 'red')+
  geom_line(aes(x = x_grid, y = predict(poly_reg, newdata = data.frame(Level = x_grid,Level2 = x_grid^2,Level3 = x_grid^3,Level4 = x_grid^4))),colour = 'green')+
  ggtitle('Trhth or Burff')+
  xlab('Level')+
  ylab('Salary')

#预测结果(单一) y_pred = 330378.8
y_pred = predict(line_reg, data.frame(Level = 6.5))

#预测结果(多项) y_pred = 158862.5 
y_pred = predict(poly_reg, data.frame(Level = 6.5,
                                      Level2 = 6.5^2,
                                      Level3 = 6.5^3,
                                      Level4 = 6.5^4))

最优秀的结果如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值