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回归问题的求解
【任务步骤】
- 传入特征组和标签,以及学习率和搜索步数
- 计算目标函数的次梯度
- 更新 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:岭回归
【任务目标】
实现岭回归算法
【任务步骤】
- 传入特征和标签
- 计算岭回归目标函数的最优解
"""
类说明: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回归和岭回归算法来求解房价预测问题。
【任务步骤】
- 加载加尼福利亚房屋数据集
- 按照一定比例划分训练集和测试集
- 对训练集和测试集进行特征处理
- 定义模型进行训练
- 计算模型训练得分、模型测试得分以及均方误差
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回归和岭回归求解多项式回归问题
【任务步骤】
- 加载加尼福利亚房屋数据集
- 按照一定比例划分训练集和测试集
- 对特征组进行多项式处理
- 对数据进行特征处理
- 定义模型进行训练
- 计算模型训练得分、模型测试得分以及均方误差
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))
实验结果
任务三:
任务四
?
?
|