5.3 Ridge 回归分析

岭回归(英文名:ridge regression, Tikhonov regularization)是一种专用于共线性数据分析的有偏估计回归方法,实质上是一种改良的最小二乘估计法,通过放弃最小二乘法的无偏性,以损失部分信息、降低精度为代价获得回归系数更为符合实际、更可靠的回归方法,对病态数据的拟合要强于最小二乘法。
参数α控制要对模型进行正则化的程度。如果α=0,那么岭回归就是线性回归。如果α非常大,那么所有权重都非常接近于零,结果是一条穿过数据平均值的平线。
在这里插入图片描述

## 定义回归函数
from sklearn.linear_model import  Ridge
from sklearn.metrics import r2_score,mean_absolute_error
def ridge_regression(data,test, predictors,pre_y, alpha):
    # 拟合模型
    ridgereg = Ridge(alpha=alpha,normalize=True, max_iter=1e5)
    ridgereg.fit(data[predictors],data[pre_y])
    y_pred = ridgereg.predict(test[predictors])
    
    # 输出模型的结果
    ret = [alpha]
    ret.append(r2_score(test[pre_y],y_pred))
    ret.append(mean_absolute_error(test[pre_y],y_pred))
    ret.extend(ridgereg.coef_)
    return ret
# 初始化预测自变量 和预测因变量
predictors= ['AGE', 'SEX', 'BMI', 'BP', 'S1', 'S2', 'S3', 'S4', 'S5', 'S6']
prey = "Y"
# 定义alpha的取值范围
alpha_ridge = np.linspace(0.00005,2,20)

# 初始化数据表用来板寸系数和得分
col = ['alpha','r2_score','mae','AGE', 'SEX', 'BMI', 'BP', 'S1', 'S2', 'S3', 'S4', 'S5', 'S6']
ind = ['alpha_%.2g'%alpha_ridge[i] for i in range(0,len(alpha_ridge))]
coef_matrix_ridge = pd.DataFrame(index=ind, columns=col)

## 百分之80的数据用于训练,剩余的数据用于测试
np.random.seed(24)
index = np.random.permutation(diabete.shape[0])
trainindex = index[1:350]
testindex = index[350:-1]
diabete_train = diabete.iloc[trainindex,:]
diabete_test = diabete.iloc[testindex,:]

#根据alpha的值迭代:
for i in range(len(alpha_ridge)):
    coef_matrix_ridge.iloc[i,] = ridge_regression(diabete_train,diabete_test,predictors,prey, alpha_ridge[i])

coef_matrix_ridge.sample(5)

在这里插入图片描述

# 初始化预测自变量 和预测因变量
predictors= ['AGE', 'SEX', 'BMI', 'BP', 'S1', 'S2', 'S3', 'S4', 'S5', 'S6']
prey = "Y"
# 定义alpha的取值范围
alpha_lasso = np.linspace(0.00005,2,20)

# 初始化数据表用来板寸系数和得分
col = ['alpha','r2_score','mae','AGE', 'SEX', 'BMI', 'BP', 'S1', 'S2', 'S3', 'S4', 'S5', 'S6']
ind = ['alpha_%.2g'%alpha_lasso[i] for i in range(0,len(alpha_lasso))]
coef_matrix_lasso = pd.DataFrame(index=ind, columns=col)
## 百分之80的数据用于训练,剩余的数据用于测试
np.random.seed(24)
index = np.random.permutation(diabete.shape[0])
trainindex = index[1:350]
testindex = index[350:-1]
diabete_train = diabete.iloc[trainindex,:]
diabete_test = diabete.iloc[testindex,:]

#根据alpha的值迭代:
for i in range(len(alpha_ridge)):
    coef_matrix_ridge.iloc[i] = ridge_regression(diabete_train,diabete_test,predictors,prey, alpha_ridge[i])

coef_matrix_ridge.sample(5)
coef_matrix_ridge.sort_values("mae").head(5)

在这里插入图片描述

ploty = ['AGE', 'SEX', 'BMI', 'BP', 'S1', 'S2', 'S3', 'S4', 'S5', 'S6']
shape = ["s","p","*","h","+","x","D","o","v",">"]
plt.figure(figsize=(15,6))
plt.grid("on")
plt.subplot(1,2,1)
for ii in np.arange(len(ploty)):
    plt.plot(coef_matrix_ridge["alpha"],coef_matrix_ridge[ploty[ii]],
             color = plt.cm.Set1(ii / len(ploty)),label = ploty[ii],
            marker = shape[ii])
    
    plt.legend()
    plt.xlabel("Alpha")
    plt.ylabel("标准化系数",FontProperties = fonts)

plt.subplot(1,2,2)
plt.plot(coef_matrix_ridge["alpha"],coef_matrix_ridge["mae"],linewidth = 2)
plt.xlabel("Alpha")
plt.ylabel("绝对值误差",FontProperties = fonts)
plt.suptitle("Ridge回归分析",FontProperties = fonts)
plt.show()

在这里插入图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
为了使用线性岭回归分析NCAA football数据,需要进行以下步骤: 1. 收集NCAA football数据集,包括球队的统计数据和比赛结果。 2. 将数据集分为训练集和测试集。 3. 对训练集进行特征工程和数据预处理(如标准化数据)。 4. 使用线性岭回归模型拟合训练集的数据。 5. 对测试集进行预测,并计算预测结果的准确性。 以下是一个使用Python中的Scikit-learn库来实现线性岭回归模型的示例代码: ```python import pandas as pd import numpy as np from sklearn.linear_model import Ridge from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error # 加载数据集 data = pd.read_csv("ncaa_football_data.csv") # 分离特征和目标变量 X = data.drop("win", axis=1) y = data["win"] # 将数据集分为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 特征标准化 scaler = StandardScaler() X_train = scaler.fit_transform(X_train) X_test = scaler.transform(X_test) # 使用线性岭回归模型拟合训练集的数据 model = Ridge(alpha=0.5) model.fit(X_train, y_train) # 对测试集进行预测 y_pred = model.predict(X_test) # 计算预测结果的准确性(均方误差) mse = mean_squared_error(y_test, y_pred) print("均方误差:", mse) ``` 在这个示例中,我们使用了一个名为“ncaa_football_data.csv”的数据集,其中包含了NCAA football球队的统计数据和比赛结果。我们首先将数据集分为训练集和测试集,然后使用标准化的数据进行特征工程和预处理。接着,我们使用Scikit-learn库中的Ridge模型来拟合训练集的数据,并对测试集进行预测。最后,我们计算预测结果的准确性(均方误差)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大桃子技术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值