机器学习算法之多项式回归

Python实现——二次多项式回归(最小二乘法) 2019/3/25 真的,当那个图像出现的时候,我真的感觉太美了。 或许是一路上以来自我的摸索加深的我对于这个模型的感受吧。 二次函数拟合——最小二乘法公式法 与线性回归相似,对二次函数进行拟合某种意义上也只是加了一个函数,虽然求解的方程变得更加繁琐,需要准备的变量也增加到了七个。 思路有借鉴于:最小二乘法拟合二次曲线 C语言 为了更好的理解回归问题中最小二乘法的求偏导过程,这次我选择自... 阅读详情

机器学习算法之多项式回归

目录:

  • 1.多项式回归简介
  • 2.编程实验多项式回归
  • 3.过拟合和欠拟合
  • 4.学习曲线
  • 5.验证数据集与交叉验证
  • 6.偏差方差均衡
  • 7.模型正则化

一、多项式回归简介

考虑下面的数据,虽然我们可以使用线性回归来拟合这些数据,但是这些数据更像是一条二次曲线,相应的方程是y=ax2+bx+c,这个式子虽然可以理解为二次方程,但是我们呢可以从另外一个角度来理解这个式子:

如果将x2理解为一个特征,将x理解为另外一个特征,换句话说,本来我们的样本只有一个特征x,现在我们把他看成有两个特征的一个数据集。多了一个特征x2,那么从这个角度来看,这个式子依旧是一个线性回归的式子,但是从x的角度来看,他就是一个二次的方程

多项式回归:相当于为样本添加了一些特征,这些特征是原来样本的多项式项,增加了这些特征之后,我们可以使用线性回归的思路更好的拟合我们的数据。

二、编程实验多项式回归

1.模拟多项式回归的数据集

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

x = np.random.uniform(-3,3,size=100)
X = x.reshape(-1,1)
y = 0.5*x**2 + x + 2+np.random.normal(0,1,size=100)

plt.scatter(x,y)
<matplotlib.collections.PathCollection at 0x1665e9db6a0>

在这里插入图片描述

2.使用线性回归拟合数据

from sklearn.linear_model import LinearRegression

lin_reg = LinearRegression()
lin_reg.fit(X,y)
y_predict = lin_reg.predict(X)

plt.scatter(x,y)
plt.plot(X,y_predict,color="r")
[<matplotlib.lines.Line2D at 0x1665eefd940>]

在这里插入图片描述

很明显,用一条直线来拟合有弧度的曲线,效果是不好的。

3.解决方案,添加一个特征

原来的数据都在X中,现在对X中每一个数据都进行平方

再将得到的数据集与原数据集进行拼接

再用新的数据集进行线性回归

(X**2).shape
(100, 1)
X2 = np.hstack([X,X**2])
lin_reg2 = LinearRegression()
lin_reg2.fit(X2,y)
y_predict2 = lin_reg2.predict(X2)

plt.scatter(x,y)
plt.plot(np.sort(x),y_predict2[np.argsort(x)],color="r")
[<matplotlib.lines.Line2D at 0x166615f3710>]

在这里插入图片描述

总之:

多项式回归在机器学习算法上并没有新的地方,完全是使用线性回归的思路

它的关键在于为原来的样本,添加新的特征,而我们得到新的特征的方式在在原有特征的多项式的组合。

采用这样的方式,我们就可以解决一些非线性的问题。

与此同时需要注意,PCA是对我们的数据机芯降维处理,而多项式回归是让数据升维,在升维之后使得算法可以更好的拟合高纬度的数据

4.sklearn中的多项式回归

# 数据进行处理
from sklearn.preprocessing import PolynomialFeatures

poly = PolynomialFeatures()
poly.fit(X)
X3 = poly.transform(X)
X3[:5]
array([[ 1.        ,  2.4708992 ,  6.10534284],
       [ 1.        , -1.28689158,  1.65608995],
       [ 1.        ,  0.70399937,  0.49561511],
       [ 1.        , -0.91605936,  0.83916474],
       [ 1.        ,  1.36063097,  1.85131664]])
# 调用LinearRegression对X2进行预测
lin_reg3 = LinearRegression()
lin_reg3.fit(X3,y)
y_predict3 = lin_reg3.predict(X3)

plt.scatter(x,y)
plt.plot(np.sort(x),y_predict3[np.argsort(x)],color="r")
[<matplotlib.lines.Line2D at 0x166616262b0>]

在这里插入图片描述

5.使用Pipline来实现多项式回归的过程

pipline的英文名字是管道,那么如何使用管道呢,先考虑我们的多项式回归的过程

  • 1.使用PolynomialFeatures生成多项式特征的数据集
  • 2.如果生成数据幂特别的大,那么特征之间的差距就会很大,导致我们的搜索非常慢,这时候就需要数据归一化
  • 3.进行线性回归

pipline的作用就是把上面的三个步骤合并,使得我们不用一直重复这三步

# 准备数据
x = np.random.uniform(-3,3,size=100)
X = x.reshape(-1,1)
y = 0.5*x**2 + x + 2+np.random.normal(0,1,size=100)
# pipline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
# 传入每一步的对象名和类的实例化
poly_reg = Pipeline([
    ("poly",PolynomialFeatures(degree=2)),
    ("std_scaler",StandardScaler()),
    ("lin_reg",LinearRegression())
])
# 预测及绘图展示
poly_reg.fit(X,y)
y_predict = poly_reg.predict(X)

plt.scatter(x,y)
plt.plot(np.sort(x),y_predict[np.argsort(x)],color="r")
[<matplotlib.lines.Line2D at 0x16661626208>]

在这里插入图片描述

三、过拟合和欠拟合

1.什么是过拟合和欠拟合

# 数据准备
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression

x = np.random.uniform(-3,3,size=100)
X = x.reshape(-1,1)
y = 0.5*x**2 + x + 2+np.random.normal(0,1,size=100)

a.线性回归

lin_reg = LinearRegression()
lin_reg.fit(X,y)
y_predict = lin_reg.predict(X)

plt.scatter(x,y)
plt.plot(X,y_predict,color='r')
[<matplotlib.lines.Line2D at 0x16661682400>]

在这里插入图片描述

from sklearn.metrics import mean_squared_error

y_predict = lin_reg.predict(X)
mean_squared_error(y,y_predict)
3.3341226155406303

2.使用多项式回归

# 使用Pipeline构建多项式回归
def PolynomialRegression(degree):
    poly_reg = Pipeline([
        ('poly',PolynomialFeatures(degree=degree)),
        ('std_scaler',StandardScaler()),
        ('lin_reg',LinearRegression())
    ])
    return poly_reg

poly_reg2 = PolynomialRegression(2)
poly_reg2.fit(X,y)
y2_predict = poly_reg2.predict(X)
# 显然使用多项式回归得到的结果是更好的
mean_squared_error(y,y2_predict)
1.111897309325084
plt.scatter(x,y)
plt.plot(np.sort(x),y2_predict[np.argsort(x)],color='r')
[<matplotlib.lines.Line2D at 0x1666175e470>]

在这里插入图片描述

3.使用更高的维度进行多项式回归

a.使用10个维度

# 使用10个维度
poly_reg10 = PolynomialRegression(10)
poly_reg10.fit(X,y)
y10_predict = poly_reg10.predict(X)
mean_squared_error(y,y10_predict)
0.9427318831233271
plt.scatter(x,y)
plt.plot(np.sort(x),y10_predict[np.argsort(x)],color='r')
[<matplotlib.lines.Line2D at 0x166617b25c0>]

在这里插入图片描述

b.使用100个维度

poly_reg100 = PolynomialRegression(100)
poly_reg100.fit(X,y)
y100_predict = poly_reg100.predict(X)
# 显然使用多项式回归得到的结果是更好的
mean_squared_error(y,y100_predict)
0.5566399955159339
plt.scatter(x,y)
plt.plot(np.sort(x),y100_predict[np.argsort(x)],color='r')
[<matplotlib.lines.Line2D at 0x16661827208>]

在这里插入图片描述

X_plot = np.linspace(-3,3,100).reshape(100,1)
y_plot = poly_reg100.predict(X_plot)

plt.scatter(x,y)
plt.plot(X_plot,y_plot,color='r')
plt.axis([-3 , 3 , -1,10 ])
[-3, 3, -1, 10]

在这里插入图片描述

总结

degree从2到10到100的过程中,虽然均方误差是越来越小的,从均方误差的角度来看是更加小的
但是他真的能更好的预测我们数据的走势吗,例如我们选择2.5到3的一个x,使用上图预测出来的y的大小(0或者-1之间)显然不符合我们的数据

  • 换句话说,我们使用了一个非常高的数据,虽然使得我们的样本点获得了更小的误差,但是这条曲线完全不是我们想要的样子,它为了拟合我们所有的样本点,变得太过于复杂了,这种情况就是过拟合
  • 相反,在最开始,我们直接使用一根直线来拟合我们的数据,也没有很好的拟合我们的样本特征,当然它犯的错误不是太过于复杂,而是太过简单,这种情况就是欠拟合。

对于上述这样的一个图,会有两条曲线:

  • 一个是对于训练数据集来说的,模型越复杂,模型准确率越高,因为模型越复杂,对训练数据集的拟合就越好,相应的模型准确率就越高
  • 对于测试数据集来说,在模型很简单的时候,模型的准确率也比较低,随着模型逐渐变复杂,对测试数据集的准确率在逐渐的提升,提升到一定程度后,如果模型继续变复杂,那么我们的模型准确率将会进行下降(欠拟合->正合适->过拟合)

欠拟合和过拟合的标准定义

  • 欠拟合:算法所训练的模型不能完整表述数据关系
  • 过拟合:算法所训练的模型过多的表达了数据间的噪音关系

四、学习曲线

1.什么是学习曲线

随着训练样本的逐渐增大,算法训练出的模型的表现能力

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(666)
x = np.random.uniform(-3,3,size=100)
X = x.reshape(-1,1)
y = 0.5 * x**2 + x + 2 + np.random.normal(0,1,size=100)

plt.scatter(x,y)
<matplotlib.collections.PathCollection at 0x166618de2e8>

在这里插入图片描述

2.实际编程实现学习曲线

from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=10)

print(X_train.shape,type(X_train))
print(X_test.shape,type(X_test))
print(y_train.shape,type(y_train))
print(y_test.shape,type(y_test))
(75, 1) <class 'numpy.ndarray'>
(25, 1) <class 'numpy.ndarray'>
(75,) <class 'numpy.ndarray'>
(25,) <class 'numpy.ndarray'>

a.观察线性回归的学习曲线

观察线性回归的模型,随着训练数据集增加,性能的变化

from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

def plot_learning_curve(algo,X_train,X_test,y_train,y_test):
    train_score = []
    test_score = []

    # 计算学习曲线数据
    for i in range(1,len(X_train)+1):
        algo.fit(X_train[:i],y_train[:i])

        y_train_predict = algo.predict(X_train[:i])
        train_score.append(mean_squared_error(y_train[:i],y_train_predict))

        y_test_predict = algo.predict(X_test)
        test_score.append(mean_squared_error(y_test,y_test_predict))

    # 绘制学习曲线
    plt.plot([i for i in range(1,len(X_train)+1)],np.sqrt(train_score),label = 'train')
    plt.plot([i for i in range(1,len(X_train)+1)],np.sqrt(test_score),label = 'test')
    plt.axis([0,len(X_train)+1,0,4])
    plt.legend()

    
plot_learning_curve(LinearRegression(),X_train,X_test,y_train,y_test)

在这里插入图片描述

从趋势上看:

  • 在训练数据集上,误差是逐渐升高的。这是因为我们的训练数据越来越多,我们的数据点越难得到全部的累积,不过整体而言,在刚开始的时候误差变化的比较快,后来就几乎不变了
  • 在测试数据集上,在使用非常少的样本进行训练的时候,刚开始我们的测试误差非常的大,当训练样本大到一定程度以后,我们的测试误差就会逐渐减小,减小到一定程度后,也不会小太多,达到一种相对稳定的情况
  • 在最终,测试误差和训练误差趋于相等,不过测试误差还是高于训练误差一些,这是因为,训练数据在数据非常多的情况下,可以将数据拟合的比较好,误差小一些,但是泛化到测试数据集的时候,还是有可能多一些误差

b.观察多项式回归的学习曲线

from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import Pipeline

# 使用Pipline构建多项式回归模型
def PolynomialRegression(degree):
    return Pipeline([
    ("poly",PolynomialFeatures(degree=degree)),
    ("std_scaler",StandardScaler()),
    ("lin_reg",LinearRegression())
    ])

# 使用二阶多项式回归
poly2_reg = PolynomialRegression(2)
plot_learning_curve(poly2_reg,X_train,X_test,y_train,y_test)

在这里插入图片描述

首先整体从趋势上,和线性回归的学习曲线是类似的

仔细观察,和线性回归曲线的不同在于,线性回归的学习曲线1.5,1.8左右;2阶多项式回归稳定在了1.0,0.9左右,2阶多项式稳定的误差比较低,说明使用二阶线性回归的性能是比较好的

# 使用20阶多项式回归
poly20_reg = PolynomialRegression(20)
plot_learning_curve(poly20_reg,X_train,X_test,y_train,y_test)

在这里插入图片描述

在使用20阶多项式回归训练模型的时候可以发现,在数据量偏多的时候,我们的训练数据集拟合的是比较好的,但是测试数据集的误差相对来说增大了很多,离训练数据集比较远,通常这就是过拟合的结果,他的泛化能力是不够的

五、验证数据集与交叉验证

使用分割训练数据集合测试数据集来判断我们的机器学习性能的好坏,虽然是一个非常好的方案,但是会产生一个问题:针对特定测试数据集过拟合

我们每次使用测试数据来分析性能的好坏,一旦发现结果不好,我们就换一个参数(可能是degree也可能是其他超参数)重新进行训练。这种情况下,我们的模型在一定程度上围绕着测试数据集打转。也就是说我们在寻找一组参数,使得这组参数训练出来的模型在测试结果集上表现的最好。但是由于这组测试数据集是已知的,我们相当于在针对这组测试数据集进行调参,那么他也有可能产生过拟合的情况,也就是我们得到的模型针对测试数据集过拟合了

那么怎么解决这个问题呢?

解决的方式就是:我们需要将我们的数据集分为三部分,这三部分分别是训练数据集,验证数据集,测试数据集。

我们使用训练数据集训练好模型之后,将验证数据集送给这个模型,看看这个训练数据集训练的效果是怎么样的,如果效果不好,我们重新换参数,重新训练模型,直到我们的模型针对验证数据集已经达到最优。

这样我们的模型达到最优之后,再将测试数据集送给模型,这样才能作为衡量模型最终的性能。

换句话说我们的测试数据集是不参与模型的创建的,而其他两个数据集都参与了训练。但是我们的测试数据集对于模型是完全不可知的,相当于我们在模型这个模型完全不知道的数据

这种方法还会有一个问题。由于我们的模型可能会针对验证数据集过拟合,而我们只有一份验证数据集,一旦我们的数据集里有比较极端的情况,那么模型的性能就会下降很多,那么为了解决这个问题,就有了交叉验证。

1.交叉验证

交叉验证相对来说是比较正规的、比较标准的在我们调整我们的模型参数的时候看我们的性能的方式

交叉验证:在训练模型的时候,通常把数据分成k份,例如分成3份(ABC)(分成k分,k属于超参数),这三份分别作为验证数据集和训练数据集。这样组合后可以分别产生三个模型,这三个模型,每个模型在测试数据集上都会产生一个性能的指标,这三个指标的平均值作为当前这个算法训练处的模型衡量的标准是怎样的。

由于我们有一个求平均的过程,所以不会由于一份验证数据集中有比较极端的数据而导致模型有过大的偏差,这比我们只分成训练、验证、测试数据集要更加准确

2.编程实现

import numpy as np
from sklearn import datasets
digits = datasets.load_digits()
X = digits.data
y = digits.target
from sklearn.model_selection import train_test_split

X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.4,random_state =666)
from sklearn.neighbors import KNeighborsClassifier

best_score,best_k,best_p = 0,0,0
# k为k近邻中的寻找k个最近元素
for k in range(2,10):
    # p为明科夫斯基距离的p
    for p in range(1,5):
        knn_clf = KNeighborsClassifier(weights='distance',n_neighbors=k,p=p)
        knn_clf.fit(X_train,y_train)
        score = knn_clf.score(X_test,y_test)
        if score > best_score:
            best_score,best_k,best_p = score,k,p
print("Best_score = ",best_score)
print("Best_k = ",best_k)
print("Best_p = ",best_p)
Best_score =  0.9860917941585535
Best_k =  3
Best_p =  4

3.交叉验证

# 使用sklearn提供的交叉验证
from sklearn.model_selection import cross_val_score
# 使用交叉验证的方式来进行调参的过程
best_score,best_k,best_p = 0,0,0
# k为k近邻中的寻找k个最近元素
for k in range(2,10):
    # p为明科夫斯基距离的p
    for p in range(1,5):
        knn_clf = KNeighborsClassifier(weights='distance',n_neighbors=k,p=p)
        scores = cross_val_score(knn_clf,X_train,y_train)
        score = np.mean(scores)
        if score > best_score:
            best_score,best_k,best_p = score,k,p
print("Best_score = ",best_score)
print("Best_k = ",best_k)
print("Best_p = ",best_p)
Best_score =  0.9823599874006478
Best_k =  2
Best_p =  2

通过观察两组调参过程的结果可以发现

  • 1.两组调参得出的参数结果是不同的,通常这时候我们更愿意详细使用交叉验证的方式得出的结果。
    因为使用train_test_split很有可能只是过拟合了测试数据集得出的结果
  • 2.使用交叉验证得出的最好分数0.982是小于使用分割训练测试数据集得出的0.986,因为在交叉验证的
    过程中,通常不会过拟合某一组的测试数据,所以平均来讲这个分数会稍微低一些

但是使用交叉验证得到的最好参数Best_score并不是真正的最好的结果,我们使用这种方式只是为了拿到
一组超参数而已,拿到这组超参数后我们就可以训练处我们的最佳模型

knn_clf = KNeighborsClassifier(weights='distance',n_neighbors=2,p=2)
# 用我们找到的k和p。来对X_train,y_train整体fit一下,来看他对X_test,y_test的测试结果
knn_clf.fit(X_train,y_train)
# 注意这个X_test,y_test在交叉验证过程中是完全没有用过的,也就是说我们这样得出的结果是可信的
knn_clf.score(X_test,y_test)
0.980528511821975

4.网格搜索

我们上面的操作,实际上在网格搜索的过程中已经进行了,只不过这个过程是sklean的网格搜索自带的一个过程

# GridSearchCV里的cv实际上就是交叉验证的方式
from sklearn.model_selection import GridSearchCV

param_grid = [
{
"weights":['distance'],
"n_neighbors":[i for i in range(2,10)],
"p":[i for i in range(1,6)]
}
]
knn_clf = KNeighborsClassifier()
# cv默认为3,可以修改改参数,修改修改不同分数的数据集
grid_search = GridSearchCV(knn_clf,param_grid,verbose=1,cv=3)
grid_search.fit(X_train,y_train)
Fitting 3 folds for each of 40 candidates, totalling 120 fits


[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.
[Parallel(n_jobs=1)]: Done 120 out of 120 | elapsed:  1.5min finished





GridSearchCV(cv=3, error_score='raise-deprecating',
       estimator=KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
           metric_params=None, n_jobs=None, n_neighbors=5, p=2,
           weights='uniform'),
       fit_params=None, iid='warn', n_jobs=None,
       param_grid=[{'weights': ['distance'], 'n_neighbors': [2, 3, 4, 5, 6, 7, 8, 9], 'p': [1, 2, 3, 4, 5]}],
       pre_dispatch='2*n_jobs', refit=True, return_train_score='warn',
       scoring=None, verbose=1)
grid_search.best_score_
# 和我们上面得到的best_score 是吻合的
0.9823747680890538
grid_search.best_params_
{'n_neighbors': 2, 'p': 2, 'weights': 'distance'}
best_knn_clf = grid_search.best_estimator_
best_knn_clf.fit(X_train,y_train)
best_knn_clf.score(X_test,y_test)
0.980528511821975

5.总结

虽然整体速度慢了,但是这个结果却是可信赖的
极端情况下,K-folds cross validation可以叫做留一法

六、偏差方差均衡

模型误差=偏差(Bias)均差(Variance)+不可避免的误差

1.偏差

2.方差

模型没有完全的学到数据的中心,而学习到了噪音。

机器学习的主要调整来源于方差(这是站在算法的角度上,而不是问题的角度上,比如对金融市场的理解,很多人尝试用历史的数据预测未来的金融走势,这样的尝试通常都不太理想。很有可能因为历史的金融趋势不能很好的反应未来的走向,这种预测方法本身带来的非常大的偏差)换句话说,我们很容易让模型变的很复杂,从而降低模型的偏差,但是由于这样的模型的方差非常的大,最终也没有很好的性能。

3.解决高方差的通常手段

  • 1.降低模型复杂度
  • 2.减少数据维度;降噪;
  • 3.增加样本数
  • 4.使用验证集
  • 5.模型正则化

七、模型正则化

1.模型正则化

下面是我们之前使用多项式回归过拟合一个样本的例子,可以看到这条模型曲线非常的弯曲,而且非常的陡峭,可以想象这条曲线的一些θ系数会非常的大。

模型正则化需要做的事情就是限制这些系数的大小。

2.模型正则化基本原理

3.岭回归Ridge Regression

编程实现岭回归

import numpy as np
import matplotlib.pyplot as plt

# 模型样本
np.random.seed(42)
x = np.random.uniform(-3.0,3.0,size=100)
X = x.reshape(-1,1)
y = 0.5 * x + 3 + np.random.normal(0,1,size=100)

# 绘制样本曲线
plt.scatter(x,y)
<matplotlib.collections.PathCollection at 0x16661d39a90>

在这里插入图片描述

from sklearn.preprocessing import PolynomialFeatures
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.pipeline import Pipeline

# 定义多项式回归函数
def PolynomialRegression(degree):
    return Pipeline([
    ("poly",PolynomialFeatures(degree=degree)),
    ("std_scaler",StandardScaler()),
    ("lin_reg",LinearRegression())
    ])
from sklearn.model_selection import train_test_split

# 分割数据集
np.random.seed(666)
X_train,X_test,y_train,y_test = train_test_split(X,y)
from sklearn.metrics import mean_squared_error

# 多项式回归对样本进行训练,使用20个维度
poly20_reg = PolynomialRegression(20)
poly20_reg.fit(X_train,y_train)

y20_predict = poly20_reg.predict(X_test)
mean_squared_error(y_test,y20_predict)
167.9401085999025
# 定义绘图模型
def plot_module(module):
    X_plot = np.linspace(-3,3,100).reshape(100,1)
    y_plot = module.predict(X_plot)

    plt.scatter(x,y)
    plt.plot(X_plot[:,0],y_plot,color='r')
    plt.axis([-3,3,0,6])
# 绘制模型曲线--过拟合(非常的完全,两段有极端的情况)
plot_module(poly20_reg)

在这里插入图片描述

from sklearn.linear_model import Ridge

def RidgeRegression(degree,alpha):
    return Pipeline([
    ("poly",PolynomialFeatures(degree=degree)),
    ("std_scaler",StandardScaler()),
    ("ridge_reg",Ridge(alpha=alpha))
    ])
# 注意alpha后面的参数是所有theta的平方和,而对于多项式回归来说,岭回归之前得到的θ都非常大
# 所以为了限制让他们比较小,我们前面系数可以取的小一些
ridge1_reg = RidgeRegression(degree=20,alpha=0.00001)
ridge1_reg.fit(X_train,y_train)
ridge1_predict = ridge1_reg.predict(X_test)
mean_squared_error(y_test,ridge1_predict)
1.3874378026530747
# 通过使用岭回归,使得我们的均方误差小了非常多,曲线也缓和了非常多
plot_module(ridge1_reg)

在这里插入图片描述

ridge2_reg = RidgeRegression(degree=20,alpha=1)
ridge2_reg.fit(X_train,y_train)
ridge2_predict = ridge2_reg.predict(X_test)
mean_squared_error(y_test,ridge2_predict)
1.1888759304218461
# 让ridge2_reg 的alpha值等于1,均差误差更加的缩小,并且曲线越来越趋近于一根倾斜的直线
plot_module(ridge2_reg)

在这里插入图片描述

ridge3_reg = RidgeRegression(degree=20,alpha=100)
ridge3_reg.fit(X_train,y_train)
ridge3_predict = ridge3_reg.predict(X_test)
mean_squared_error(y_test,ridge3_predict)
1.3196456113086197
# 得到的误差依然是比较小,但是比之前的1.18大了些,说明正则化做的有些过头了
plot_module(ridge3_reg)

在这里插入图片描述

ridge4_reg = RidgeRegression(degree=20,alpha=100000)
ridge4_reg.fit(X_train,y_train)
ridge4_predict = ridge4_reg.predict(X_test)
mean_squared_error(y_test,ridge4_predict)
# 当alpha非常大,我们的模型实际上相当于就是在优化θ的平方和这一项,使得其最小(因为MSE的部分相对非常小)
# 而使得θ的平方和最小,就是使得每一个θ都趋近于0,这个时候曲线就趋近于一根直线了
plot_module(ridge4_reg)

在这里插入图片描述

4.LASSO

编程实现LASSO

import numpy as np
import matplotlib.pyplot as plt

# 模型样本
np.random.seed(42)
x = np.random.uniform(-3.0,3.0,size=100)
X = x.reshape(-1,1)
y = 0.5 * x + 3 + np.random.normal(0,1,size=100)

# 绘制样本曲线
plt.scatter(x,y)
<matplotlib.collections.PathCollection at 0x16661cf8dd8>

在这里插入图片描述

from sklearn.linear_model import Lasso

def LassoRegression(degree,alpha):
    return Pipeline([
    ("poly",PolynomialFeatures(degree=degree)),
    ("std_scatter",StandardScaler()),
    ("lasso_reg",Lasso(alpha=alpha))
    ])
# 这里的alpha起始值比岭回归的时候大了很多,是由于现在是绝对值
lasso1_reg = LassoRegression(degree=20,alpha=0.01)
lasso1_reg.fit(X_train,y_train)
lasso1_predict = lasso1_reg.predict(X_test)
mean_squared_error(lasso1_predict,y_test)
1.149608084325997
plot_module(lasso1_reg)

在这里插入图片描述

# 增大alpha继续试验
lasso2_reg = LassoRegression(degree=20,alpha=0.1)
lasso2_reg.fit(X_train,y_train)
lasso2_predict = lasso2_reg.predict(X_test)
mean_squared_error(lasso2_predict,y_test)
1.1213911351818648
# 非常接近一根直线
plot_module(lasso2_reg)

在这里插入图片描述

# 增大alpha继续试验
lasso3_reg = LassoRegression(degree=20,alpha=1)
lasso3_reg.fit(X_train,y_train)
lasso3_predict = lasso3_reg.predict(X_test)
mean_squared_error(lasso3_predict,y_test)
1.8408939659515595
# alpha=1的时候正则化已经过头了
plot_module(lasso3_reg)

在这里插入图片描述

5.总结

回归分析(三)——多项式回归解决非线性问题 git源码:https://github.com/xuman-Amy/Regression-Analysis 【将线性回归模型转换为曲线——多项式回归】 之前都是将解释变量和目标值之间的关系假设为线性的,如果假设不成立,可以添加多项式选项,转换为多项式回归。 【sklearn实现多项式回归】 1、PoltnomialFeatures实现二项回归 # quadratic 二项回归 ... 阅读详情

相关推荐

学习笔记TF055:TensorFlow神经网络简单实现一元二次函数

TensorFlow运行方式。加载数据、定义超参数,构建网络,训练模型,评估模型、预测。构造一个满足一元二次函数y=ax^2+b原始数据,构建最简单神经网络,包含输入层、隐藏层、输出层。TensorFlow学习隐藏层、输出层weights、biases。观察训练次数增加,损失值变化。生成、加载数据。方程y=x^2-0.5。构造满足方程的x、y。加入不满足方程噪声点。import tensor flo

利炳根 692

机器学习中的数学原理——多项式回归

​ 这个专栏主要是用来分享一下我在机器学习中的学习笔记及一些感悟,也希望对你的学习有帮助哦!感兴趣的小伙伴欢迎私信或者评论区留言!这一篇就更新一下《白话机器学习中的数学——多项式回归》!

weixin_63866037的博客 1572

机器学习经典算法:多项式回归

多项式回归基于线性回归的思想,在模型中引入了自变量的高次幂项,从而使得模型能够拟合非线性关系的数据。

Norah 的技术博客 810

多项式回归

多项式回归相当于线性回归的特殊形式。 比如:一元二次多项式:y=w0+w1x+w2x2 将其转换为:y=w0+w1∗x1+w2∗x2 (x=x1 x2=x2 ) 这样就变成了多元线性回归。 这样就实现了 一元高次多项式到多元一次多项式之间的转换 之前,我们通过 y=wx+b 线性回归模型进行拟合。 同样,y=w0+w1x+w2x2,若能得到由 x=x1,x2=x2构成的特征矩阵...

程序狗的成长之路 1917

机器学习-回归算法中使用多项式解决欠拟合问题

算法模型构建过程中,需要注意下面两个方面: 1、算法模型的误差不能太大(预测值和真实值之间的误差不能太大) a. 如果模型的误差比较大 (1) 如果是训练集数据存在该问题: 欠拟合:该模型没有找到特征属性和目标属性之间的关系。 导致的原因: 算法的学习能力比较弱、 样本少、 有用的特征属性数目少 解决方案: 换一种学习能力比较强的算法。例如:SVM、集成算法… 增加样本数量(基于现有的数据产...

Yangwenyi115615的博客 766

机器学习-回归算法中使用多项式——管道解决欠拟合问题

管道操作: 代码如下: #引入所需要的包 import sklearn from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.preprocessing import StandardScaler from sklearn...

Yangwenyi115615的博客 437

机器学习之监督学习(一)线性回归、多项式回归、算法优化[巨详细笔记]

机器学习详细入门,看这篇就够了!

2301_79376014的博客 1974

6、机器学习中的回归算法:从线性到多项式

本文深入探讨了机器学习中的回归算法,涵盖线性回归与多项式回归的基本原理及TensorFlow实现方法。介绍了如何通过成本函数、梯度下降优化器构建模型,并扩展到实际应用如房价和股票价格预测。同时,文章还讲解了正则化、特征选择和模型融合等优化技术,帮助提升模型泛化能力与性能,适合希望掌握回归算法及其应用的读者。

garlic的博客 52

机器学习——多项式回归算法

多项式回归(Polynomial Regression)是线性回归的扩展形式,通过引入自变量的高次项来建模非线性关系。其核心思想是通过增加多项式特征,使线性模型能够拟合复杂的曲线数据。与线性回归的关系:本质仍是线性模型,因为权重参数是线性的特征空间从一维扩展到高维

wu73guang5jian的博客 1632

LeRobot SO100仿真操控避坑指南:从MuJoCo模型调试到实机同步(附参数修正模板)

本文详细解析了LeRobot SO100机械臂在MuJoCo仿真操控中的常见问题与解决方案,包括关节转向符号调试、偏移值校准及实机同步技术。通过实战案例和参数修正模板,帮助开发者高效解决仿真与实机差异,提升机器人开发效率。

weixin_29064009的博客 246

FFmpeg + OBS 低延迟直播串流实战:从H264裸流到RTP组播的完整配置

本文详细介绍了如何利用FFmpeg将H264裸流转码为RTP协议,并通过组播技术实现与OBS客户端的超低延迟直播串流。文章深入剖析了FFmpeg关键参数调优、SDP文件生成与配置,以及OBS客户端的无缝拉流方法,为需要毫秒级实时交互的场景提供了一套去中心化、高效稳定的完整解决方案。

fanta的博客 830

机器学习(Machine learning)3——多项式回归算法(Polynomial Regression Algorithm)

机器学习(Machine learning)——多项式回归算法(Polynomial Regression Algorithm)

qq_41116319的博客 244

基于AutoDL复现A-LOAM

Ceres solver 是谷歌开发的一款用于非线性优化的库,在谷歌的开源激光雷达slam项目cartographer中被大量使用。在autodl上面租服务器,地区我租的重庆A区的,GPU我选择的是RTX4090,基础镜像选择的是Miniconda / conda3 / 3.8(ubuntu20.04)/11.6。在AutoDL中我使用的方式是先将该数据集先下载到自己的电脑上,然后再上传到虚拟机中。用MobaXterm解决该问题!搜到的一个解决方式:该问题属于ceres版本问题,将A-LOAM下的。

m0_61281610的博客 1943

机器学习-多项式回归算法

多项式回归(Polynomial Regression)顾名思义是包含多个自变量的回归算法,也叫多元线性回归,多数时候利用一元线性回归(一条直线)不能很好拟合数据时,就需要用曲线,而多项式回归就是求解这条曲线。

有一分热,发一分光。 3319

YOLOv8_obb的C++工程部署实战:从模型转换到实时视频推理

本文详细介绍了YOLOv8_obb模型在C++环境下的完整工程部署流程,涵盖从PyTorch模型到ONNX格式的转换、基于ONNX Runtime的C++推理引擎搭建、旋转框后处理解析,以及实时视频流处理与性能优化。文章重点解析了模型转换的关键参数、环境配置的常见问题、核心推理代码的实现,并提供了实用的避坑指南,旨在帮助开发者高效完成YOLOv8_obb的C++工程部署。

weixin_29100927的博客 45

Python操作WPS文档

在Python中,我们可以使用第三方库来操作WPS文档,实现自动化的文档处理。本文将介绍如何使用Python来打开、读取、修改和保存WPS文档的内容。库,我们可以打开、读取、修改和保存WPS文档的内容。你可以根据自己的需求进一步扩展和优化这些代码,实现更复杂的文档处理功能。安装完成后,我们就可以开始使用它来操作WPS文档了。方法将修改后的文档保存到指定的路径。方法将修改后的文档保存到指定的路径。在上面的代码中,我们通过修改段落的。属性,可以改变段落的文本内容。完成对文档的修改后,我们可以使用。

2301_79366177的博客 5617

机器学习 | 回归算法原理——多项式回归

Hi,大家好,我是半亩花海。接着上次的最速下降法(梯度下降法)继续更新《白话机器学习的数学》这本书的学习笔记,在此分享多项式回归这一回归算法原理。本章的回归算法原理基于《基于广告费预测点击量》项目,欢迎大家交流学习!

沉思默想,深度学习,半亩星河半亩月,半亩花海半亩云。 1349

Python爬虫实战:如何通过解析JSON数据抓取抖音视频评论

本文介绍了如何使用Python爬虫抓取抖音视频评论数据。请求头伪造:通过使用随机的User-Agent,模拟真实用户的请求。代理池:使用代理IP来避免被封禁。JSON解析:直接从API接口获取JSON格式的数据,避免了动态加载内容的限制。需要注意的是,抓取网站数据时应遵守网站的爬虫协议,避免过度抓取影响网站性能或违反法律法规。希望本文能够帮助你掌握如何抓取和分析抖音视频评论数据!

2201_76125261的博客 3361

机器学习算法04——多项式回归算法实战

摘要:本文主要介绍机器学习算法的多项式回内容。包括多项式回归的定义,其与线性回归的区别,实战内容。

yue200403的博客 722

智能生活中枢:基于 ESP32-S3 的桌面智能助手与日程提醒终端设计与实现

本文完成了基于 ESP32-S3 的桌面智能助手与日程提醒终端的完整设计,实现了时间同步、日程管理、声光提醒、环境监测、本地存储等核心功能。硬件接线简洁、软件逻辑清晰,可直接制作成品使用。硬件方案:以 ESP32-S3 为核心,搭配 OLED、DS3231、DHT11、按键、声光模块,接线标准化、易复刻;软件方案:基于 Arduino 开发,提供标准 Mermaid 软件流程图,代码模块化、可直接编译运行;核心功能:网络授时、本地日程管理、掉电存储、声光提醒、温湿度监测,满足桌面智能助手全场景需求。

weixin_42300449的博客 209

英伟达 Jetson AGX Thor 官方入门教程(二)CUDA、Docker、JetPack 设置

本文详细介绍了NVIDIA Jetson AGX Thor开发套件的安装与配置流程。主要内容包括:1) BSP安装的三种方法(Jetson ISO、SDK Manager和Linux刷写脚本)及其适用场景;2) Docker环境的完整配置步骤及测试方法;3) CUDA工具包的两种安装方式(容器化和原生安装)及其性能对比;4) JetPack SDK的安装选项。文章提供了详细的命令行操作指南和故障排除建议,帮助开发者快速搭建AI开发环境,充分发挥Jetson平台的硬件性能优势。

机器人控制与仿真应用 1737

机器学习之回归算法(多项式扩展)

目标函数(损失函数)分类 多项式介绍 时间与电压的多项式扩展 原始的6个特征结果拟合不够好 多项式的扩展(阶数过大,有可能导致过拟合)

Hubert的博客 1619

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

机器学习算法 _06 多项式回归

11

weixin_41672684的博客 840

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

python 机器学习 一元和二元多项式回归 梯度下降算法

python 机器学习 一元多项式回归 一元多项式 一元多项式表达式为: Y=WTX=[w0+w1+⋯+wn]⋅[1+x+⋯+xn−1]T Y=W^TX=\left[ w_0+w_1+\cdots +w_n \right] \cdot \left[ 1+x+\cdots +x^{n-1} \right] ^T Y=WTX=[w0​+w1​+⋯+wn​]⋅[1+x+⋯+xn−1]T 其中高次项为一次项的高次幂,将该式写为多元表达式: Y=WTX=[w0+w1+⋯+wn]⋅[x1+x2+⋯+xn]T Y=W^T

Big_SHOe的博客 3524

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

上一篇: 机器学习算法之梯度下降法
下一篇: TensorFlow(keras)入门课程--01 机器学习的Hello World
mind_programmonkey
mind_programmonkey 领域专家: 算法与数据结构技术领域 领域专家: 算法与数据结构技术领域
博客等级 码龄9年 4435粉丝 1111原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mind_programmonkey

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值