在机器学习中,我们时常需要对给定的一系列点进行拟合,其中常见的拟合方式有线性拟合、套索拟合、多项式拟合等。通过拟合来进行回归,回归分析是一种预测性的建模技术,它研究的是因变量和自变量之间的关系。不管是建模,还是分析数据,回归分析都是重要的工具。

线性拟合是最简单的拟合,但是效果往往不佳,并且无法解决多分类的问题。

import csv
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures


def lineFit(col):
    y = read_col([col])
    print(y)
    x = np.arange(len(y))
    
    lr = LinearRegression()
    lr.fit(x.reshape(-1,1), y)
    y_new = lr.predict(x.reshape(-1, 1))
    plt.plot(x, y_new, color = 'g', marker = 'x',)
    plt.xlim(0,len(y))
    plt.savefig("test.png")
    plt.show()

效果图如下:

java线性拟合函数 线性拟合算法_java线性拟合函数

但是,有时所给数据点用直线拟合并不合适,那么这时候就可以考虑用多项式拟合。但是需要注意的是,多项式中的degree即幂次数需要我们确定,过小会造成欠拟合,而过大则会造成过拟合。当我们使用数据训练分类器的时候,很重要的一点就是要在过度拟合与拟合不足之间达成一个平衡。而这就需要经验、实验的积累。

def PolyFitPlt(col):
    y = read_col([col])
    x = np.arange(len(y))
    plt.scatter(x,y)   
    Poly_pro = PolynomialFeatures(degree = 9)
    lr = LinearRegression()
    x_transform = Poly_pro.fit_transform(x.reshape(-1,1))
    lr.fit(x_transform,y)
    xx = Poly_pro.transform(x.reshape(-1,1))
    y_new = lr.predict(xx)
    plt.plot(x, y_new, color = 'g', marker = 'x',)
    plt.xlim(0,len(y))
    plt.savefig("./FittingPic/" + str(col) + ".png")
    plt.show()

java线性拟合函数 线性拟合算法_java线性拟合函数_02

结果发现,使用多项式回归之后效果明显改善不少。

除了以上两种回归,机器学习经常使用的还有岭回归与Lasso回归。

顺带提一下,岭回归应用的是L2正则惩罚,而Lasso回归应用的是L1正则惩罚。

它们的出现都是为了解决线性回归出现的过拟合问题。以及,这两种回归均通过在损失函数中引入正则化项来达到目的。岭回归不抛弃任何一个特征,缩小了回归系数。而Lasso回归能够使得损失函数中的许多θ均变成0,即使用过大的惩罚系数来降低θ的权重。

最后介绍一下逐步回归。

在处理高维数据集的时候,以及在处理多个自变量时,我们可以使用这种形式的回归。在这种回归方法中,自变量的选择是在一个自动的过程中完成的,其中包括非人为操作。

通过观察统计的值,如R-square,t-stats和AIC指标,来识别重要的变量。逐步回归通过同时添加/删除基于指定标准的协变量来拟合模型。下面列出了一些最常用的逐步回归方法:

在逐步回归法中,主要进行的是增加和删除每个步骤所需的预测。

  • 向前选择法从模型中最显著的预测开始,然后为每一步添加变量。
  • 向后剔除法与模型的所有预测同时开始,然后在每一步消除最小显着性的变量。