做的网站怎么上传,网络营销推广方案思路,北京建站模板厂家,html网页制作代码加图机器学习升维 升维使用sklearn库实现特征升维实现天猫年度销量预测实现中国人寿保险预测 升维 定义#xff1a;将原始的数据表示从低维空间映射到高维空间。在线性回归中#xff0c;升维通常是通过引入额外的特征来实现的#xff0c;目的是为了更好地捕捉数据的复杂性#… 机器学习升维 升维使用sklearn库实现特征升维实现天猫年度销量预测实现中国人寿保险预测 升维 定义将原始的数据表示从低维空间映射到高维空间。在线性回归中升维通常是通过引入额外的特征来实现的目的是为了更好地捕捉数据的复杂性特别是当数据之间的关系是非线性的时候。 目的解决欠拟合问题提高模型的准确率。为解决因对预测结果考虑因素比较少而无法准确计算出模型参数问题。 常用方法将已知维度进行自乘或相乘来构建新的维度。 本文主要记录的是线性回归中遇到数据呈现非线性特征时该如何处理
切记对训练集特征升维后也要对测试集、验证集特征数据进行升维操作
数据准备如下 如果对其直接进行线性回归则拟合后的模型如下 从上述两图可知对于具有非线性特征的图像不对其使用特使的处理则无法对其产生比较好的模型拟合。
上述图像生成代码
# 导包
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
# 创建数据
X np.linspace(-1,11,100)
y (X - 5)**2 3*X 12 np.random.randn(100)
X X.reshape(-1,1)
# display(X.shape,y.shape)
plt.scatter(X,y)# 不升维直接用线性回归解决
model LinearRegression()
model.fit(X,y)
X_test np.linspace(-2,12,300).reshape(-1,1)
y_test model.predict(X_test)
plt.scatter(X,y)
plt.plot(X_test,y_test,color red)为了使得可以对具有非线性特征的数据进行处理生成一个较好的模型可是实现预测的任务于是便有了升维操作下举例升维和不升维的区别 不升维二维数据x1, x2若不对其进行升维操作则其拟合的多元线性回归公式为: y w 1 ∗ x 1 w 2 ∗ x 2 w 0 y w_1*x_1 w_2*x_2 w_0 yw1∗x1w2∗x2w0 升维若对二维数据x1x2进行升维操作则其可有5个维度以自乘为例x1、x2、x12x22、x1*x2在加上一个偏置项w0一共有六个参数则其拟合后的多元线性回归公式为 y w 0 w 1 ∗ x 1 w 2 ∗ x 2 w 3 ∗ x 1 2 w 4 ∗ x 2 2 w 5 ∗ x 1 ∗ x 2 y w_0w_1*x_1w_2*x_2w_3*x_1^2w_4*x_2^2w_5*x_1*x_2 yw0w1∗x1w2∗x2w3∗x12w4∗x22w5∗x1∗x2 若这样则由原本的一维线性方程转换成了二维函数最直观的表现则原本的数据集则可以拟合成下图所示的模型 上图生成代码如下
# 导包
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
X np.linspace(-1,11,100)
y (X - 5)**2 3*X 12 np.random.randn(100)
X X.reshape(-1,1)# 升维可以解决多项式的问题直观表现为可以让直线进行拐弯
np.set_printoptions(suppressTrue)
X2 np.concatenate([X,X**2], axis 1)
# 注只需要对特征进行升维不需要对目标值进行升维# 生成测试数据
X_test np.linspace(-2,12,300).reshape(-1,1)
model2 LinearRegression()
model2.fit(X2,y)
X_test2 np.concatenate([X_test,X_test**2],axis1)
y_test2 model2.predict(X_test2)
print(所求的w是\n,model2.coef_)
print(所求的截距b是\n,model2.intercept_)# 绘制图像的时候要用没升维的数据进行绘制
plt.scatter(X,y,colorgreen)
plt.plot(X_test,y_test2,color red)使用sklearn库实现特征升维
在sklearn中具有很多封装好的工具可以直接调用。
from sklearn.preprocessing import PolynomialFeatures # 多项式升维的python库
使用方法:
# 特征和特征之间相乘
poly PolynomialFeatures(interaction_onlyTrue)
A [[3,2]]
poly.fit_transform(A)
# 生成结果array([[1., 3., 2., 6.]])#特征之间乘法自己和自己自乘在上述情况下加上自己的乘法
poly PolynomialFeatures(interaction_onlyFalse)
A [[3,2,5]]
poly.fit_transform(A)
# 生成结果array([[ 1., 3., 2., 5., 9., 6., 15., 4., 10., 25.]])# 可以通过degree来提高升维的大小
poly PolynomialFeatures(degree4,interaction_onlyFalse)# 特征和特征之间相乘
A [[3,2,5]]
poly.fit_transform(A)
# 生成结果:
# array([[ 1., 3., 2., 5., 9., 6., 15., 4., 10., 25., 27.,
# 18., 45., 12., 30., 75., 8., 20., 50., 125., 81., 54.,
# 135., 36., 90., 225., 24., 60., 150., 375., 16., 40., 100.,
# 250., 625.]])实现天猫年度销量预测
实现代码
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures,StandardScaler
from sklearn.linear_model import LinearRegression,SGDRegressor# 创建数据
X np.arange(2009,2020).reshape(-1,1) - 2008
y np.array([0.5,9.36,52,191,350,571,912,1207,1682,2135,2684])
plt.scatter(X,y)
# 创建测试数据
X_test np.linspace(2009,2020,100).reshape(-1,1) - 2008# 数据升维
ploy PolynomialFeatures(degree2, interaction_onlyFalse)
X2 ploy.fit_transform(X)
X_test2 ploy.fit_transform(X_test)# 模型创建LinearRegression
model LinearRegression(fit_interceptFalse)
model.fit(X2,y)
y_pred model.predict(X_test2)
print(参数w为,model.coef_)
print(参数b为,model.intercept_)plt.scatter(X,y,colorgreen)
plt.plot(X_test,y_pred,colorred)# 使用SGD进行梯度下降,必须要归一化,否则效果会非常不好
# 创建测试数据
X_test np.linspace(2009,2019,100).reshape(-1,1) - 2008# 数据升维
ploy PolynomialFeatures(degree2, interaction_onlyFalse)
X2 ploy.fit_transform(X)
X_test2 ploy.fit_transform(X_test)#对数据进行归一化操作
standard StandardScaler()
X2_norm standard.fit_transform(X2)
X_test2_norm standard.fit_transform(X_test2)# 模型创建SGDRegression
model SGDRegressor(eta00.3, max_iter5000)
model.fit(X2_norm,y)
y_pred model.predict(X_test2_norm)
print(参数w为,model.coef_)
print(参数b为,model.intercept_)plt.scatter(X,y,colorgreen)
plt.plot(X_test,y_pred,colorred)这里需要说明一下情况如果第二段代码不进行归一化则呈现的是下图 如果进行了归一化则产生的和法一LinearRegession是一样的图形基本相同 这是什么原因 线性回归Linear Regression和随机梯度下降SGD在处理特征尺度不同的问题上有一些不同之处导致线性回归相对于特征尺度的敏感性较低。SGD的更新规则涉及学习率η和梯度。如果不同特征的尺度相差很大梯度的大小也会受到这种尺度差异的影响。因此在引入高次项或其他非线性特征需要注意特征的尺度避免数值上的不稳定性。SGD中的正则化项通常依赖于权重的大小。通过归一化可以使得正则化项对所有特征的影响更加平衡。 实现中国人寿保险预测
import pandas as pd
import seaborn as sns
import numpy as np
from sklearn.linear_model import LinearRegression,ElasticNet
from sklearn.metrics import mean_squared_error,mean_squared_log_error
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import PolynomialFeatures# 读取数据
data_renshou pd.read_excel(your_path/中国人寿.xlsx)
# 可以通过下式生成图像查看那些数据是好数据那些是不好的数据——好特征差别大容易区分
#sns.kdeplot(datadata_renshou, xcharges,huesex,shadeTrue)
#sns.kdeplot(datadata_renshou, xcharges,huesmoker,shadeTrue)
#sns.kdeplot(datadata_renshou, xcharges,hueregion,shadeTrue)
#sns.kdeplot(datadata_renshou, xcharges,huechildren,shadeTrue)# 特征工程对数据进行处理
data_renshou data_renshou.drop([region,sex],axis 1) # 删除不好的特征# 体重指数离散化转换体重两种情况标准fat
def conver(df,bmi):df[bmi] fat if df[bmi] bmi else standardreturn df
data_renshou data_renshou.apply(conver, axis1,args(30,))# 特征提取离散转数值型数据
data_renshou pd.get_dummies(data_renshou)
data_renshou.head()#特征和目标值提取
# 训练数据
x data_renshou.drop(charges, axis1)
# 目标值
y data_renshou[charges]# 划分数据
X_train,X_test,y_train,y_test train_test_split(x,y,test_size0.2)# 特征升维(导致了他下面的参数biandu)
poly PolynomialFeatures(degree2, include_biasFalse)
X_train_poly poly.fit_transform(X_train)
X_test_poly poly.fit_transform(X_test)
# 模型训练与评估
np.set_printoptions(suppressTrue)
model LinearRegression()
model.fit(X_train_poly,y_train)
print(测试数据得分,model.score(X_train_poly,y_train))
print(预测数据得分,model.score(X_test_poly,y_test))
print(测试数据均方误差,np.sqrt(mean_squared_error(y_test,model.predict(X_test_poly))))
print(训练数据均方误差,np.sqrt(mean_squared_error(y_train,model.predict(X_train_poly))))
print(测试数据对数误差,np.sqrt(mean_squared_log_error(y_test,model.predict(X_test_poly))))
print(训练数据对数误差,np.sqrt(mean_squared_log_error(y_train,model.predict(X_train_poly))))
print(获得的参数为,model.coef_.round(2),model.intercept_.round(2))