[机器学习与scikit-learn-30]:算法-回归-普通线性模型拟合非线性分布数据-遇到的问题
Posted 文火冰糖的硅基工坊
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[机器学习与scikit-learn-30]:算法-回归-普通线性模型拟合非线性分布数据-遇到的问题相关的知识,希望对你有一定的参考价值。
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客
本文网址:https://blog.csdn.net/HiWangWenBing/article/details/123559005
目录
前言:
文本通过代码展现普通的线性模型拟合非线性模型遇到的问题。
第1步骤:导入库
# 导入所需要的库
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.tree import DecisionTreeRegressor
第2步骤:生成非线性分布数据集
# 创建需要拟合的非线性分布数据集
rnd = np.random.RandomState(42) #设置随机数种子
X = rnd.uniform(-3, 3, size=100) #random.uniform,从输入的任意两个整数中取出size个随机数
#生成y的思路:先使用NumPy中的函数生成一个sin函数图像,然后再人为添加噪音
y = np.sin(X) + rnd.normal(size=len(X)) / 3 #random.normal,生成size个服从正态分布的随机数
#使用散点图观察建立的数据集是什么样子
plt.scatter(X, y,marker='o',c='k',s=20)
plt.show()
#为后续建模做准备:sklearn只接受二维以上数组作为特征矩阵的输入
print(X.shape)
X = X.reshape(-1,1)
(100,)
第3步骤:创建普通线性模型并进行拟合
# 使用原始数据进行建模
#使用原始数据进行建模
# (1) 普通线性模型
LinearR = LinearRegression() # 创建模型
LinearR = LinearR.fit(X, y) # 训练模型
# (2)决策树线性拟合模型
TreeR = DecisionTreeRegressor(random_state=0) # 创建模型
TreeR = TreeR.fit(X, y) # 训练模型
第4步骤:可视化拟合效果
# 可是化拟合效果
#放置画布
fig, ax1 = plt.subplots(1)
#创建测试数据:一系列分布在横坐标上的点
line = np.linspace(-3, 3, 1000, endpoint=False).reshape(-1, 1)
#将测试数据带入predict接口,获得模型的拟合效果并进行绘制
ax1.plot(line, LinearR.predict(line), linewidth=2, color='green',label="linear regression")
ax1.plot(line, TreeR.predict(line), linewidth=2, color='red', label="decision tree")
#将原数据上的拟合绘制在图像上
ax1.plot(X[:, 0], y, 'o', c='k')
#其他图形选项
ax1.legend(loc="best")
ax1.set_ylabel("Regression output")
ax1.set_xlabel("Input feature")
ax1.set_title("Result before discretization")
plt.tight_layout()
plt.show()
从上图可以看出:
(1)线性模型的效果非常糟糕,与数值真实分布的图形相差甚远。
(2)决策树的精度,取决于决策树的层数,层数分支越多,越容易过拟合。
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客
本文网址:https://blog.csdn.net/HiWangWenBing/article/details/123559005
以上是关于[机器学习与scikit-learn-30]:算法-回归-普通线性模型拟合非线性分布数据-遇到的问题的主要内容,如果未能解决你的问题,请参考以下文章
机器学习机器学习入门02 - 数据拆分与测试&算法评价与调整