机器学习-sklearn-多项式回归-对函数拟合-看学习曲线(均方误差MSE)-pipeline

发布于:2023-01-18 ⋅ 阅读:(504) ⋅ 点赞:(0)

上一篇说到了sql留存率的代码,那能不能做一个留存率预测呢?Hive-SQL取一个月用户留存率、留存用户数_lanston别熬夜了的博客-CSDN博客

可以用到sklearn-库中的pipeline库进行多项式回归预测,此类预测还可用与一些有趋势的线性或非线性预测,类似于波士顿放假变化趋势和牛市的时候股价上升趋势等等。

代码如下:

首先读取数据

import pandas as pd
import numpy as np
import math
df = pd.read_excel('留存.xlsx')
X = df['X']
Y = df['Y']

定义一个多项式函数,主要返回pipeline ,代码如下

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


def PolynomialRegression(degree):
    return Pipeline([
        ("poly", PolynomialFeatures(degree)),
        ("std_scaler", StandardScaler()),
        ("line_reg", LinearRegression())
    ])



# 创建管道对象
pipe = PolynomialRegression(3) #这里的degree函数就是多项式最高次数项次数

# 训练管道
pipe.fit(df[['X']],Y)

# 获取预测值
yhat = pipe.predict(df[['X']])

print()

具体pipeline 参数参考链接:每天一点sklearn之Pipeline(9.9) - 知乎

然后是划分机器学习的测试集与训练集中、画学习曲线。

学习曲线主要绘制的训练集和测试集在模型上的均方误差(MSE)

均方误差的定义如下:

均方误差(Mean Square Error,MSE)是回归损失函数中最常用的误差,它是预测值f(x)与目标值y之间差值平方和的均值,其公式如下所示:

 均方误差参考链接:深度学习_损失函数(MSE、MAE、SmoothL1_loss...)_ClFH的博客-CSDN博客_mse损失函数

划分测试集和训练集代码如下:

from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,Y,test_size = 0.2,random_state = 1)
X_train,X_test,y_train,y_test = np.array(X_train).reshape(-1,1),np.array(X_test).reshape(-1,1),np.array(y_train).reshape(-1,1),np.array(y_test).reshape(-1,1)

主要用到了train_test_split函数,函数的意义是随机划分不同样本点为测试集和训练集

test_size是测试集比重,random_state = 0 或不填表示每次划分的随机方式都不同

另外train_test_split还可以在最后添加一个stratify的参数,就是设置训练集和测试集的数据类型划分比重相似(如果数据有明显类型-比如0-1,正负时),可以保证训练集和测试集相同分布,有点类似于同质性检验中的同质。

train_test_split参考链接:

机器学习之train_test_split详解_爱却晚秋�的博客-CSDN博客_train_test_split

然后是定义损失函数曲线并画图了:

from sklearn.metrics import mean_squared_error
def plot_learning_curve(reg, X_train, X_test, y_train, y_test):
    # 使用线性回归绘制学习曲线
    train_score = []
    test_score = []

    for i in range(1, len(X_train)):
        reg.fit(X_train[:i], y_train[:i])
        y_train_predict = reg.predict(X_train[:i])
        y_test_predict = reg.predict(X_test)
        train_score.append(mean_squared_error(y_train_predict, y_train[:i]))
        test_score.append(mean_squared_error(y_test_predict, y_test))

    plt.axis([0,40,0, 0.5])
    plt.plot([i for i in range(1, len(X_train))], np.sqrt(train_score), label="train")
    plt.plot([i for i in range(1, len(X_train))], np.sqrt(test_score), label="test")
    
    plt.legend()
    plt.show()

调用函数就可以展示学习曲线了,先调用1次方程-线性回归

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

产出下面曲线;

 然后是调用2次多项式

reg_line2 = PolynomialRegression(2)
plot_learning_curve(reg_line2, X_train, X_test, y_train, y_test)

产出如下;

 同理,调用6次多项式

reg_line6 = PolynomialRegression(6)
plot_learning_curve(reg_line6, X_train, X_test, y_train, y_test)

发现训练集过拟合了,选择一个拟合效果最好的多项式

学习曲线拟合效果参考链接:

机器学习入门 8-5 学习曲线 - 腾讯云开发者社区-腾讯云

 选择最好次数的拟合效果的多项式,用全部数据拟合一条曲线并画图展示:

调用函数

pipe = PolynomialRegression(3)

# 训练管道
pipe.fit(df[['X']],Y)

# 获取预测值
yhat = pipe.predict(df[['X']])

展示图片:(因为数据隐私就不展示图片了)

import matplotlib.pyplot as plt 
plt.scatter(X,Y)
plt.plot(np.sort(X),yhat,color = 'r')
plt.show()

显示出方程:(因为数据隐私就不展示方程系数了)

coef = np.polyfit(X, Y, 3)
print(coef)
y_fit = np.poly1d(coef)
print(y_fit)

大功告成,记得关注喔


网站公告

今日签到

点亮在社区的每一天
去签到