上一篇说到了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)
大功告成,记得关注喔