线性模型加上正则化

  • 使用弹性网络回归(Elastic Net Regression)算法来预测波士顿房屋价格。弹性网络回归是一种结合了L1和L2正则化惩罚的线性回归模型,能够处理高维数据和具有多重共线性的特征。弹性网络回归的目标函数包括数据拟合损失和正则化项:

    • m i n w 1 2 n ∣ ∣ y − X w ∣ ∣ 2 2 + α ( λ ∣ ∣ w ∣ ∣ 1 + 1 2 ( 1 − λ ) ∣ ∣ w ∣ ∣ 2 2 ) min_w\frac{1}{2n}||y-Xw||^2_2+\alpha(\lambda||w||_1+\frac12(1-\lambda)||w||^2_2) minw2n1∣∣yXw22+α(λ∣∣w1+21(1λ)∣∣w22)

    • 其中, y y y是目标变量向量, X X X是输入特征矩阵, w w w是模型的权重系数, n n n是样本数, α \alpha α是正则化强度参数, λ \lambda λ是 Elastic Net 混合参数,用来控制L1和L2正则化项的权重。

  • 处理数据流程

    • 加载波士顿房屋价格数据集,将特征矩阵存储为X,目标变量存储为y。
    • 分割数据集为训练集和测试集。
    • 对特征矩阵进行特征缩放,以避免不同特征尺度带来的问题。
    • 使用ElasticNet类来拟合训练数据,并进行预测。
    • 评估模型在测试集上的性能。
  • from sklearn.model_selection import train_test_split
    from sklearn.preprocessing import StandardScaler
    from sklearn.linear_model import ElasticNet
    from sklearn.metrics import mean_squared_error
    from matplotlib import pyplot as plt
    import pandas as pd
    import numpy as np
    from tqdm import tqdm
    import time
    def ela_net(X_tr,X_te,y_tr,alpha,l1):
        s = StandardScaler()
        X_tr_s = s.fit_transform(X_tr)
        X_te_s = s.fit_transform(X_te)
        ela_model = ElasticNet(alpha=alpha,l1_ratio=l1,random_state=2023)
        ela_model.fit(X_tr_s,y_tr)
        y_pre = ela_model.predict(X_te_s)
        return y_pre
    data_url = "http://lib.stat.cmu.edu/datasets/boston"
    raw_df = pd.read_csv(data_url, sep="\s+", skiprows=22, header=None)
    data = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]])
    target = raw_df.values[1::2, 2]
    X, y = data, target
    X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.3, random_state=2023)
    best_a,best_l,min_res = 0,0,float('inf')
    for i in tqdm(np.arange(0.1,1,0.1).round(1)):
        time.sleep(0.5)
        for j in np.arange(0.1,1,0.1).round(1):
        # print(i)
            y_pre = ela_net(X_tr,X_te,y_tr,i,j)
            mes = mean_squared_error(y_pre,y_te)
            if mes < min_res:
                min_res = mes
                best_a,best_l = i,j
            print(mes)
    print("alpha:",best_a,",lambda:",best_l,",mse:",min_res)
    
  • 目标是使用Lasso回归算法来建立一个预测模型,通过输入特征预测房屋价格中位数。Lasso回归是一种线性回归的扩展方法,它通过加入L1正则化项来进行特征选择和模型参数的压缩。Lasso回归的优化目标函数如下:

    • m i n ( ∑ i − 1 n ( y i − y i ^ ) 2 + α ∑ j − 1 p ∣ β j ∣ ) min(\sum_{i-1}^n(y_i-\hat{y_i})^2+\alpha\sum_{j-1}^p|\beta_j|) min(i1n(yiyi^)2+αj1pβj)

    • 其中, n n n 是样本数量, p p p 是特征数量, y i {y_i} yi 是实际观测值, y ^ i \hat{y}_i y^i 是预测值, β j \beta_j βj 是模型参数(系数), α \alpha α 是L1正则化项的权重。L1正则化项通过在优化过程中将某些模型参数变为0来实现特征选择的作用。较大的 α \alpha α 值将更多的系数压缩到零,从而选择出更少的特征。较小的 α \alpha α 值将保留更多的特征。

    • 通过生成一个惩罚函数是回归模型中的变量系数进行压缩,达到防止过度拟合,解决严重共线性的问题。Lasso回归通过引入L1正则化 (即Lasso惩罚项),可以将系数向量中小的权重变为0,从而实现特征选择和模型稀疏性。Lasso回归具备如下几个作用。

      • **特征选择:**Lasso回归可以用于选择最重要的特征。它通过在优化目标函数中添加一项惩罚项(L1正则化)来实现稀疏性,使得系数向量中很多特征的权重变为0。通过选择非零系数对应的特征,可以筛选出对目标变量有最大预测能力的特征,从而简化模型,提高模型的泛化能力。
      • **多重共线性问题:**在研究中,往往存在多个相关的自变量。Lasso回归可以通过自变量之间的相关关系,将相关的自变量的系数变为0,从而降低多重共线性对回归结果的影响。
      • **解释模型:**Lasso回归可以用于解释模型中的变量对目标变量的影响。通过系数的大小和正负,可以了解特定特征对目标变量的正向或负向影响程度。
    • 正则化的本质可以定义为我们对训练算法所做的任何改变,以减少泛化误差,而不是训练误差。有许多正则化策略。有的对模型进行了额外的约束,如对参数值进行约束;有的对目标函数进行了额外的约束,可以认为是对参数值进行了间接约束或软约束。

  • 模型预测流程

    • 导入数据集并进行数据预处理。数据标准化 / 归一化的作用
      • 提升模型精度:标准化 / 归一化使不同维度的特征在数值上更具比较性,提高分类器的准确性。
      • 提升收敛速度:对于线性模型,数据归一化使梯度下降过程更加平缓,更易正确的收敛到最优解。
    • 拆分数据集为训练集和测试集。
    • 初始化Lasso回归模型,并训练模型。
    • 评估模型在测试集上的性能。
    • 调整超参数来改善模型性能。
  • StandardScaler:标准化数据减去均值,然后除以标准差,经过处理后数据符合标准正态分布,即均值为0,标准差为1;适用于本身服从正态分布的数据;基本可用于有outlier的情况,但在计算方差和均值时outliers仍然会影响计算。

  • MinMaxScaler:区间缩放,基于最大最小值,将数据转换到0,1区间上的,转换函数:x = (x-min) / (max-min);适用于分布范围较稳定的数据,当新数据的加入导致max/min变化,则需重新定义;因为outlier会影响最大值或最小值,因此对outlier非常敏感。

  • RobustScaler:使用具有鲁棒性的统计量缩放带有异常值(离群值)的数据,该缩放器删除中位数,并根据百分位数范围(默认值为IQR:四分位间距)缩放数据;适用于包含许多异常值的数据;x=(x-median)/(p75-p25):默认使用第一个四分位数(25%分位数)和第3个四分位数(75%分位数)之间的范围。

  • sklearn.metrics【指标】

    • 【分类指标】
    • 1.accuracy_score(y_true,y_pre) : 精度
    • 2.auc(``x, y, reorder=False) : ROC曲线下的面积;较大的AUC代表了较好的performance
    • 3.average_precision_score(y_true, y_score, average=‘macro’, sample_weight=None):根据预测得分计算平均精度(AP)
    • 4.brier_score_loss(y_true, y_prob, sample_weight=None, pos_label=None):The smaller the Brier score, the better.
    • 5.confusion_matrix(y_true, y_pred, labels=None, sample_weight=None):通过计算混淆矩阵来评估分类的准确性 返回混淆矩阵
    • 6.f1_score(y_true, y_pred, labels=None, pos_label=1, average=‘binary’, sample_weight=None): F1值。F1 = 2 * (precision * recall) / (precision + recall) precision(查准率)=TP/(TP+FP) recall(查全率)=TP/(TP+FN)
    • 7.log_loss(y_true, y_pred, eps=1e-15, normalize=True, sample_weight=None, labels=None):对数损耗,又称逻辑损耗或交叉熵损耗
    • 8.precision_score(y_true, y_pred, labels=None, pos_label=1, average=‘binary’,) :查准率或者精度; precision(查准率)=TP/(TP+FP)
    • 9.recall_score(y_true, y_pred, labels=None, pos_label=1, average=‘binary’, sample_weight=None):查全率 ;recall(查全率)=TP/(TP+FN)
    • 10.roc_auc_score(y_true, y_score, average=‘macro’, sample_weight=None):计算ROC曲线下的面积就是AUC的值,the larger the better
    • 11.roc_curve(y_true, y_score, pos_label=None, sample_weight=None, drop_intermediate=True);计算ROC曲线的横纵坐标值,TPR,FPR;TPR = TP/(TP+FN) = recall(真正例率,敏感度) FPR = FP/(FP+TN)(假正例率,1-特异性)
    • 【回归指标】
    • 1.explained_variance_score(y_true, y_pred, sample_weight=None, multioutput=‘uniform_average’):回归方差(反应自变量与因变量之间的相关程度)
    • 2.mean_absolute_error(y_true, y_pred, sample_weight=None, multioutput=‘uniform_average’):平均绝对误差
    • 3.mean_squared_error(y_true, y_pred, sample_weight=None, multioutput=‘uniform_average’):均方差
    • 4.median_absolute_error(y_true, y_pred) 中值绝对误差
    • 5.r2_score(y_true, y_pred, sample_weight=None, multioutput=‘uniform_average’) :R平方值
      • 相关指数 R 2 R^{2} R2 表示一元多项式回归方程拟合度的高低,或者说表示一元多项式回归方程估测的可靠程度的高低。总体平方和(Total Sum of Squares): T S S = ∑ i = 1 n ( y i − y i ˉ ) 2 TSS=\sum_{i=1}^{n}\left ( y_{i}-\bar{y_{i}} \right )^{2} TSS=i=1n(yiyiˉ)2;回归平方和(Explained Sum of Squares): E S S = ∑ i = 1 n ( y i ^ − y i ˉ ) 2 ESS=\sum_{i=1}^{n}\left ( \hat{y_{i}}-\bar{y_{i}} \right )^{2} ESS=i=1n(yi^yiˉ)2;残差平方和(Residual Sum of Squares ): R S S = ∑ i = 1 n ( y i − y i ^ ) 2 RSS=\sum_{i=1}^{n}\left ( y_{i}-\hat{y_{i}} \right )^{2} RSS=i=1n(yiyi^)2。三者关系:TSS = ESS + RSS
      • Y的观测值围绕其均值的总离差(total variation)可分解为两部分:一部分来自回归线(ESS),另一部分则来自随机势力(RSS)。在给定样本中,TSS不变,如果实际观测点离样本回归线越近,则ESS在TSS中占的比重越大,因此定义拟合优度:回归平方和ESS与Y的总离差TSS的比值。即 R 2 = E S S T S S = 1 − R S S T S S R^{2} = \frac{ESS}{TSS} = 1-\frac{RSS}{TSS} R2=TSSESS=1TSSRSS 。在线性回归模型中, R 2 R^{2} R2 表示解释变量对于预测变量变化的贡献率。 R 2 R^{2} R2 越接近于1,表示回归的效果越好。因此 R 2 R^2 R2 越大,意味着残差平方和 ∑ i = 1 n ( y i − y i ^ ) 2 \sum_{i=1}^{n}\left ( y_{i}-\hat{y_{i}} \right )^{2} i=1n(yiyi^)2 越小,即模型的拟合效果越好; R 2 R^2 R2 越小,残差平方和越大,即模型的拟合效果越差。
      • sklearn.metrics.r2_score(y_true, y_pred, sample_weight=None, multioutput=’uniform_average’)
        • y_true:真实值。y_pred:预测值。sample_weight:样本权重。multioutput:多维输入输出,可选‘raw_values’, ‘uniform_average’, ‘variance_weighted’或None。默认为’uniform_average’;‘variance_weighted’对所有输出的分数进行平均,并根据每个输出的方差进行加权。‘raw_values’对每一对应列求其R2指数,返回一个与列数相同的一维数组。
  • import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    data_url = "http://lib.stat.cmu.edu/datasets/boston"
    raw_df = pd.read_csv(data_url, sep="\s+", skiprows=22, header=None)
    data = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]])
    target = raw_df.values[1::2, 2]
    print(data.shape,"\t",target.shape)
    from sklearn.model_selection import train_test_split
    from sklearn.preprocessing import RobustScaler
    X_train,X_test,y_train,y_test = train_test_split(data,target,test_size=0.3,random_state=2023)
    # ro = RobustScaler()
    # X_train_r = ro.fit_transform(X_train)
    # X_test_r = ro.fit_transform(X_test)
    from sklearn.linear_model import Lasso
    def lasso_net(alpha):
        model = Lasso(alpha=alpha)
        model.fit(X_train,y_train)
        y_pre = model.predict(X_test)
        return y_pre
    from sklearn.metrics import r2_score
    max_r , best_a= 0,0
    for i in np.arange(0.1,1,0.1).round(1):
        r2 = r2_score(lasso_net(i),y_test)
        if r2>max_r:
            max_r = r2
            best_a = i
        print(r2)
    las = Lasso(best_a)
    las.fit(X_train, y_train)
    # 绘制特征系数变化图
    features = ["CRIM","ZN","INDUS","CHAS","NOX","RM","AGE","DIS","RAD","PTRATIO","B","LSTAT","MEDV"]
    plt.plot(range(data.shape[1]), las.coef_)
    plt.xticks(range(data.shape[1]), features, rotation=90)
    # 设置数字标签
    for a, b in zip(range(data.shape[1]), las.coef_):
        plt.text(a, b, b.round(2), ha='center', va='bottom', fontsize=12)
    plt.xlabel('Features')
    plt.ylabel('Coefficients')
    plt.title('Lasso Regression Coefficients')
    plt.show()
    
  • 线性模型加上正则化_第1张图片

  • 岭回归是一种用于处理多重共线性问题的线性回归方法,它通过对模型的系数进行约束,可以提高模型的稳定性和泛化能力。岭回归通过在损失函数中添加一个L2正则化项来控制模型的复杂度。L2正则化项基于模型的系数向量的平方和来惩罚大的系数值,从而有效地减小模型的过拟合风险。

    • λ ∑ j − 1 p w j 2 \lambda\sum_{j-1}^pw^2_j λj1pwj2

    • 其中, λ \lambda λ 是我们定义的正则化参数, p p p 是特征的数量, w j w_j wj 是第 j j j 个特征的系数。岭回归的目标是最小化以下损失函数: l o s s = M S E + λ ∑ j − 1 p w j 2 loss=MSE+\lambda\sum_{j-1}^pw^2_j loss=MSE+λj1pwj2。这里的 MSE \text{MSE} MSE 是均方误差,即预测值与真实值之间的平方差的平均值。通过添加正则化项,岭回归通过权衡模型的拟合能力和稳定性来提高泛化能力

  • 数据处理步骤

    • 导入必要的库和数据集
    • 数据探索和预处理
    • 拆分数据集为特征矩阵 X 和目标向量 y
    • 归一化特征矩阵 X
    • 使用岭回归模型进行训练和预测
    • 评估模型性能
  • from sklearn.model_selection import train_test_split
    import numpy as np
    import pandas as pd
    data_url = "http://lib.stat.cmu.edu/datasets/boston"
    raw_df = pd.read_csv(data_url, sep="\s+", skiprows=22, header=None)
    data = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]])
    target = raw_df.values[1::2, 2]
    Xtrain,Xtest,ytrain,ytest = train_test_split(data,target)
    from sklearn.preprocessing import StandardScaler
    s = StandardScaler()
    Xtrains = s.fit_transform(Xtrain)
    Xtests = s.fit_transform(Xtest)
    from sklearn.linear_model import Ridge
    def ri_net(xt,yt,xtest,alpha):
        ri = Ridge(alpha=alpha)
        ri.fit(xt,yt)
        y_pre = ri.predict(xtest)
        return y_pre
    from sklearn.metrics import mean_absolute_percentage_error,r2_score,mean_squared_error
    for i in np.arange(0.1,2,0.1):
        ym = ri_net(Xtrains,ytrain,Xtests,i)
       print(mean_absolute_percentage_error(ytest,ym),r2_score(ytest,ym),mean_squared_error(ytest,ym))
    
    
  • 岭回归模型通过引入正则化项来对线性回归模型进行约束,以避免过拟合。使用了 Scikit-learn 中的 Ridge 类来实现岭回归,并使用均方误差来评估模型的性能。

  • 使用多项式回归模型来学习这些特征和价格之间的关系,并预测新的房屋价格。多项式回归是一种回归分析中使用的方法,可以通过拟合一个关于自变量的多项式来预测因变量的数值。与简单线性回归模型只使用一个自变量不同,多项式回归模型可以使用多个自变量来进行拟合。通过引入高次特征变量,多项式回归模型可以更好地适应非线性关系。多项式回归模型的一般形式可以表示为:

    • Y = θ 0 + θ 1 X + θ 2 X 2 + … + θ n X n Y = \theta_0 + \theta_1X + \theta_2X^2 + \ldots + \theta_nX^n Y=θ0+θ1X+θ2X2++θnXn

    • 其中, Y Y Y表示因变量, X X X表示自变量, θ 0 , θ 1 , … , θ n \theta_0, \theta_1, \ldots, \theta_n θ0,θ1,,θn表示模型的参数, n n n表示多项式的阶数。假设我们有一组自变量 X = { x 1 , x 2 , … , x m } X = \{x_1, x_2, \ldots, x_m\} X={x1,x2,,xm} 和对应的因变量 Y = { y 1 , y 2 , … , y m } Y = \{y_1, y_2, \ldots, y_m\} Y={y1,y2,,ym},我们的目标是找到最佳拟合的二次多项式曲线。 Y = θ 0 + θ 1 X + θ 2 X 2 Y = \theta_0 + \theta_1X + \theta_2X^2 Y=θ0+θ1X+θ2X2。为了找到最佳拟合的参数值 θ 0 , θ 1 , θ 2 \theta_0, \theta_1, \theta_2 θ0,θ1,θ2,我们可以使用最小二乘法。我们需要最小化残差平方和(RSS):

    • R S S = ∑ i = 1 m ( y i − y ^ i ) 2 RSS = \sum_{i=1}^{m}(y_i - \hat{y}_i)^2 RSS=i=1m(yiy^i)2

    • 其中, y i y_i yi是观测到的因变量值, y ^ i \hat{y}_i y^i 是根据模型得到的预测值。

  • 计算流程

    • 导入必要的库和数据集
    • 从数据集中加载数据
    • 提取特征变量和目标变量
    • 使用多项式回归模型进行拟合
    • 预测新的房屋价格
    • 计算模型的性能指标(如均方误差)
    • 绘制原始数据散点图和拟合曲线图
  • from sklearn.metrics import r2_score
    from sklearn.preprocessing import PolynomialFeatures
    from sklearn.linear_model import LinearRegression
    import numpy as np
    import pandas as pd
    data_url = "http://lib.stat.cmu.edu/datasets/boston"
    raw_df = pd.read_csv(data_url, sep="\s+", skiprows=22, header=None)
    data = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]])
    target = raw_df.values[1::2, 2]
    poly = PolynomialFeatures(degree=3)
    X_p = poly.fit_transform(data)
    model = LinearRegression()
    model.fit(X_p,target)
    y_p = model.predict(X_p)
    r2 = r2_score(target,y_p)
    print(r2)
    
  • 使用PolynomialFeatures类将原始特征向量X转换为多项式特征向量X_poly。使用LinearRegression类构建多项式回归模型并进行拟合。

你可能感兴趣的:(机器学习,L1,L2,线性模型)