驭风计划是由清华大学老师教授的,其分为四门课,包括: 机器学习(张敏教授) , 深度学习(胡晓林教授), 计算机语言(刘知远教授) 以及数据结构与算法(邓俊辉教授)。本人是综合成绩第一名,除了数据结构与算法其他单科均为第一名。`代码和报告均为本人自己实现,由于篇幅限制,只展示任务布置以及关键代码,如果需要报告或者代码可以私聊博主
机器学习部分授课老师为张敏教授,主要主要通过介绍决策树,线性回归,贝叶斯模型,SVM算法,K近邻算法,Kmeans算法以及集成学习算法等入门机器学习。
有任何疑问或者问题,也欢迎私信博主,大家可以相互讨论交流哟~~
任务介绍
大学排名是一个非常重要同时也极富挑战性与争议性的问题,一所大学的综合实力涉及科研、师资、学生等方方面面。目前全球有上百家评估机构会评估大学的综合得分进行排序,而这些机构的打分也往往并不一致。在这些评分机构中,世界大学排名中心(Center for World University Rankings,缩写CWUR)以评估教育质量、校友就业、研究成果和引用,而非依赖于调查和大学所提交的数据著称,是非常有影响力的一个。
本任务中我们将根据 CWUR 所提供的世界各地知名大学各方面的排名(师资、科研等),一方面通过数据可视化的方式观察不同大学的特点,另一方面希望构建机器学习模型(线性回归)预测一所大学的综合得分。
作业说明
使用来自 Kaggle 的数据,构建「线性回归」模型,根据大学各项指标的排名预测综合得分。
基本要求:
- 按照 8:2 随机划分训练集测试集,用 RMSE 作为评价指标,得到测试集上线性回归模型的 RMSE 值;
- 对线性回归模型的系数进行分析。
扩展要求:
- 对数据进行观察与可视化,展示数据特点;
- 尝试其他的回归模型,对比效果;
- 尝试将离散的地区特征融入线性回归模型,并对结果进行对比。
注意事项:
- 基本输入特征有 8 个:
quality_of_education
,alumni_employment
,quality_of_faculty
,publications
,influence
,citations
,broad_impact
,patents
; - 预测目标为
score
; - 可以使用 sklearn 等第三方库,不要求自己实现线性回归;
- 需要保留所有数据集生成、模型训练测试的代码;
报告
核心代码
自实现的最小二乘法
# B: 利用最小二乘法的实现
def addones(i):
"""给X特征添加一列1"""
ones = np.ones(i.shape[0]).reshape((i.shape[0],1))
return np.hstack((ones,i))
x_train_lse , x_test_lse = addones(x_train) ,addones(x_test)
## 对于非方针算逆矩阵,利用np.linalg.pinv()
regression = np.dot(np.dot(np.linalg.pinv(np.dot(x_train_lse.T,x_train_lse)),x_train_lse.T),y_train) #标准方程计算
pred_lse = np.dot(x_test_lse,regression)
自实现的梯度下降法# C:梯度下降法
class Graddesent()
def updataTheta(self,data,lr):
'''#定义一个batch的梯度下降函数
data:[:,:-1] 是x特征 , [:,-1]是y
lr:学习率
w = w - lr * (gradient_w::2*(y - (wx + b))x)
b = b - lr * (gradient_b::2*(y - (wx + b))
'''
batchsize = len(data) #样本个树
#初始化batah的梯度
batch_gradient_b = 0
batch_gradient_w = 0
for sample in data:
sample_x = np.array(sample[:-1]) # x
sample_y = sample[-1]
#print(sample_x.shape, type(sample_y) , self.weight.shape)
#计算每个batch里w的梯度均值
y = (np.dot(sample_x,self.weight) + self.bias)
# #计算每个batch里bw的梯度
sample_gradient_b = 2 * (y - sample_y)
sample_gradient_w = 2 * np.dot((y - sample_y),sample_x.reshape(1,sample_x.shape[0]))
batch_gradient_w += sample_gradient_w
batch_gradient_b += sample_gradient_b
# print(batch_gradient_w.shape , batch_gradient_b.shape)
# #更新参数值
self.weight = self.weight - lr * batch_gradient_w / batchsize
self.bias = self.bias - lr * batch_gradient_b / batchsize
# #print(self.weight , self.bias )
c = Graddesent()
c.fit(x_train, y_train, batchsize = 100, lr = 0.1 , epoch = 1000)
y_predict = c.predict(x_test)
rmse_mbgd = np.sqrt(MSE(y_test,y_predict))
r2_mbgd = r2(y_test, y_predict)
print(f"梯度下降的rmse:{rmse_mbgd:.3f}")
print(f"梯度下降的r2:{r2_mbgd:.3f}")
结果
epoch Vs RMSE