机器学习实验 第三章:岭回归和Lasso回归算法

import numpy as np
from sklearn.datasets import load_boston, fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score, mean_squared_error
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import PolynomialFeatures

任务1:Lasso回归

【任务目标】

实现使用次梯度下降算法对Lasso回归问题的求解

【任务步骤】

  1. 传入特征组和标签,以及学习率和搜索步数
  2. 计算目标函数的次梯度
  3. 更新 w 的值
"""
类说明:Lasso
    编写代码实现使用次梯度下降算法对Lasso回归算法的求解
    
Parameters:
      X   - 特征组
      y   - 标签组
    eta   - 学习率
      N   - 搜索步数
   Lambda - 正则化系数
Returns:
"""
class Lasso:
    def __init__(self, Lambda = 1):
        self.Lambda = Lambda

    def fit(self, X, y, eta = 0.1, N = 1000):
#####  Start Code Here  #####   
        # 获取X的维度
        m,n=X.shape
        # 初始化w
        w=np.zeros((n,1))
        self.w=w
        # 开始N轮循环,使用次梯度下降算法对Lasso回归求解
        for t in range(N):
            e=X.dot(w)-y
            v=2*X.T.dot(e)/m+self.Lambda*np.sign(w)
            w=w-eta*v
            self.w+=w    
        self.w /= N
#####  End Code Here  #####    
    def predict(self, X):
        return X.dot(self.w)

任务2:岭回归

【任务目标】

实现岭回归算法

【任务步骤】

  1. 传入特征和标签
  2. 计算岭回归目标函数的最优解
"""
类说明:RidgeRegression
    编写代码实现实现岭回归算法
    
Parameters:
      X   - 特征组
      y   - 标签组
   Lambda - 正则化系数
Returns:
"""
class RidgeRegression:
    def __init__(self, Lambda = 1):
        self.Lambda = Lambda

    def fit(self, X, y):
#####  Start Code Here  ##### 
        # 获取X的维度
        m,n=X.shape
        
        # 计算岭回归目标函数的最优解
        r=m*np.diag(self.Lambda*np.ones(n))
        self.w=np.linalg.inv(X.T.dot(X)+r).dot(X.T).dot(y)
        
#####  End Code Here  ##### 
    def predict(self, X):
        return X.dot(self.w)

任务3:房价预测

【任务目标】

使用Lasso回归和岭回归算法来求解房价预测问题。

【任务步骤】

  1. 加载加尼福利亚房屋数据集
  2. 按照一定比例划分训练集和测试集
  3. 对训练集和测试集进行特征处理
  4. 定义模型进行训练
  5. 计算模型训练得分、模型测试得分以及均方误差
def process_features(X):
    scaler = StandardScaler()
    X = scaler.fit_transform(X)
    m, n = X.shape
    X = np.c_[np.ones((m, 1)), X]  
    return X

# 加载房价数据集
housing = fetch_california_housing()
X = housing.data
y = housing.target.reshape(-1, 1)

#####  Start Code Here  #####
# 划分数据集,训练测试集比例 8:2
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size = 0.2,random_state=0)
# 对训练集和测试集进行特征处理
X_train=process_features(X_train)
X_test=process_features(X_test)
# 定义Lasso回归模型
model=Lasso(Lambda=0.001)
# 训练模型
model.fit(X_train,y_train,eta=0.01,N=50000)

mse = mean_squared_error(y_test, model.predict(X_test))
print("Lasso模型训练得分:" + str(r2_score(y_train, model.predict(X_train))))  # 训练集
print("Lasso模型测试得分:" + str(r2_score(y_test, model.predict(X_test))))  # 待测集
print("Lasso模型的均方误差 = {}".format(mse))

# 定义岭回归模型
model=RidgeRegression(Lambda=0.01)

# 训练模型
model.fit(X_train,y_train)

#####  End Code Here  #####
mse = mean_squared_error(y_test, model.predict(X_test))
print("岭回归模型训练得分:" + str(r2_score(y_train, model.predict(X_train))))  # 训练集
print("岭回归模型测试得分:" + str(r2_score(y_test, model.predict(X_test))))  # 待测集
print("岭回归模型的均方误差 = {}".format(mse))

任务4:多项式回归

【任务目标】

使用Lasso回归和岭回归求解多项式回归问题

【任务步骤】

  1. 加载加尼福利亚房屋数据集
  2. 按照一定比例划分训练集和测试集
  3. 对特征组进行多项式处理
  4. 对数据进行特征处理
  5. 定义模型进行训练
  6. 计算模型训练得分、模型测试得分以及均方误差
def process_features(X):
    scaler = StandardScaler()
    X = scaler.fit_transform(X)
    m, n = X.shape
    X = np.c_[np.ones((m, 1)), X]  
    return X

poly = PolynomialFeatures(degree = 2)
#####  Start Code Here  #####
# 加载数据集
housing = fetch_california_housing()
X = housing.data
y = housing.target.reshape(-1, 1)

# 划分训练集和测试集
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size = 0.2,random_state=0)

# 对训练数据进行多项式处理
X_train=poly.fit_transform(X_train)

# 对测试数据进行多项式处理
X_test=poly.fit_transform(X_test)

# 对训练集和测试集进行特征处理
X_train=process_features(X_train)
X_test=process_features(X_test)
# 定义Lasso回归模型
model=Lasso(Lambda=0.01)

# 训练模型
model.fit(X_train,y_train,eta=0.01,N=50000)

mse = mean_squared_error(y_test, model.predict(X_test))
print("Lasso模型训练得分:" + str(r2_score(y_train, model.predict(X_train))))  # 训练集
print("Lasso模型测试得分:" + str(r2_score(y_test, model.predict(X_test))))  # 待测集
print("Lasso模型的均方误差 = {}".format(mse))

# 定义岭回归模型
model=RidgeRegression(Lambda=0.01)

# 训练模型
model.fit(X_train,y_train)

#####  End Code Here  #####
mse = mean_squared_error(y_test, model.predict(X_test))
print("岭回归模型训练得分:" + str(r2_score(y_train, model.predict(X_train))))  # 训练集
print("岭回归模型测试得分:" + str(r2_score(y_test, model.predict(X_test))))  # 待测集
print("岭回归模型的均方误差 = {}".format(mse))

实验结果

任务三:

任务四

 

 

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值