【机器学习】实验2,基于回归分析的大学综合得分预测(完整代码实现+分析)

一、案例简介

大学排名是一个非常重要同时也极富挑战性与争议性的问题,一所大学的综合实力涉及科研、师资、学生等方方面面。目前全球有上百家评估机构会评估大学的综合得分进行排序,而这些机构的打分也往往并不一致。在这些评分机构中,世界大学排名中心(Center for World University Rankings,缩写CWUR)以评估教育质量、校友就业、研究成果和引用,而非依赖于调查和大学所提交的数据著称,是非常有影响力的一个。

本任务中我们将根据 CWUR 所提供的世界各地知名大学各方面的排名(师资、科研等),一方面通过数据可视化的方式观察不同大学的特点,另一方面希望构建机器学习模型(线性回归)预测一所大学的综合得分。

二、作业说明

使用来自 Kaggle 的数据,构建「线性回归」模型,根据大学各项指标的排名预测综合得分。

基本要求:

  • 按照 8:2 随机划分训练集测试集,用 RMSE 作为评价指标,得到测试集上线性回归模型的 RMSE 值;

  • 对线性回归模型的系数进行分析。

扩展要求:

  • 对数据进行观察与可视化,展示数据特点;

  • 尝试其他的回归模型,对比效果;

  • 尝试将离散的国家特征融入线性回归模型,并对结果进行对比。

注意事项:

  • 基本输入特征有 8 个:quality_of_educationalumni_employmentquality_of_facultypublicationsinfluencecitationsbroad_impactpatents

  • 预测目标为score

  • 可以使用 sklearn 等第三方库,不要求自己实现线性回归;

  • 需要保留所有数据集生成、模型训练测试的代码;

三,实验结果

假设数据文件位于当前文件夹,我们用 pandas 读入标准 csv 格式文件的函数`read_csv()`将数据转换为`DataFrame`的形式。观察前几条数据记录:

去除其中包含 NaN 的数据,保留 2000 条有效记录。

取出对应自变量以及因变量的列,之后就可以基于此切分训练集和测试集,并进行模型构建与分析。

feature_cols = ['quality_of_faculty', 'publications', 'citations', 'alumni_employment', 
                'influence', 'quality_of_education', 'broad_impact', 'patents']
X = data_df[feature_cols]
Y = data_df['score']
X
import matplotlib.pyplot as plt
import seaborn as sns

# 绘制综合得分的直方图
sns.histplot(data=data_df, x='score', bins=50)
plt.title('Distribution of Scores')
plt.xlabel('Score')
plt.show()

 对于评分分布进行分析,发现50分以上占大多数。

feature_cols1 = ['quality_of_faculty', 'publications', 'citations', 'alumni_employment', 
                'influence', 'quality_of_education', 'broad_impact', 'patents', 'score']
corr = data_df[feature_cols1].corr()

# 绘制热力图
sns.heatmap(corr, cmap="coolwarm", annot=True)
plt.show()

带有热力图的观察表面,师资力量对学校评分影响最大,然后是教育质量。 

#用原始库进行进行回归分析
from sklearn import linear_model
from sklearn.model_selection import train_test_split


def model1():
    all_y = Y.values
    all_x = X.values
    x_train, x_test, y_train, y_test = train_test_split(all_x, all_y, test_size=0.2,random_state=42)#将数据分为训练集与测试集
    model = linear_model.LinearRegression()
    model.fit(x_train,y_train)#训练
    y_pre=model.predict(x_test)#预测
    mse = np.mean((y_pre - y_test) ** 2)
    rmse = np.sqrt(np.mean((y_pre - y_test)**2))
    r2 = (1-mse/np.var(y_test))
    print('RMSE值:',rmse)
    print("R2值: %.4f" %r2)#评估
    # 打印模型系数
    print("系数: ", model.coef_)
    # 打印模型截距
    print("截距: %.2f" % model.intercept_)
model1()

RMSE值: 3.2888875354885996

R2值: 0.3533

系数: [-6.84154643e-02 5.39839025e-04 -8.89789477e-05 -7.28075881e-03 8.07362578e-04 -6.73554024e-03 -2.70288062e-03 -2.43934472e-03]

截距: 66.88 

加入国家特征后并没有很好,和用原始数据差距不大,根据前面对于评分的分析我把学校分为两档,50分以上为一档,50分以下为二挡。 

def model2():
    feature_cols = ['quality_of_faculty', 'publications', 'citations', 'alumni_employment', 
                    'influence', 'quality_of_education', 'broad_impact', 'patents', 'region']
    X = data_df[feature_cols]
    Y = data_df['score']
    places = X['region'].unique()

    places = X['region'].unique()
    for place in places:
        idxs = X[X['region']==place].index
        avg = np.mean(Y.loc[idxs])
        X.loc[idxs, 'region'] = 1 if avg >= 50 else 2


    X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.2, random_state=42)
    model = linear_model.LinearRegression()
    model.fit(X_train,y_train)#训练
    y_pre=model.predict(X_test)#预测
    mse = np.mean((y_pre - y_test) ** 2)
    rmse = np.sqrt(np.mean((y_pre - y_test)**2))
    r2 = (1-mse/np.var(y_test))
    print('RMSE值:',rmse)
    print("R2值: %.4f" %r2)#评估
    # 打印模型系数
    print("系数: ", model.coef_)
    # 打印模型截距
    print("截距: %.2f" % model.intercept_)
    
model2()    

RMSE值: 3.3087621388824235

R2值: 0.3454

系数: [-6.76758272e-02 -4.27048130e-04 4.54692692e-05 -6.93710100e-03 1.11544875e-03 -6.77390337e-03 -2.08633013e-03 -2.20239048e-03 -8.15820680e-01]

截距: 67.90

总结

线性回归模型中系数的正负表示因素对结果的正或负效应。

系数的绝对值表示因素对结果的影响。系数的大小也反映了因素对结果的斜率

因此,系数的正、负和大小都可以用来分析因素对结果的影响程度

如果一个线性回归分析结果中大多数系数是负数,那么这意味着在给定其他因素不变的情况下,任何一个负数指标变小(排名更靠前),都会导致结果变大(得分更高)。这是因为当有的系数都为负数时,每个自变量的增加都会导致因变量的减少。因此,如果想要提高因变量的值,就需要尽可能让每个自变量的值更小,也就是排名更靠前。

labels = ['quality_of_faculty', 'alumni_employmen',
          'influence', 'quality_of_education', 'patents']
X = [abs(i) for i in [-319.9163560832382, -109.20161044313764, -
     50.9200735311177, -69.33926694491666, -50.728403891869085]]

fig = plt.figure()
plt.pie(X, labels=labels, autopct='%1.2f%%')  # 画饼图(数据,数据对应的标签,百分数保留两位小数点)
plt.title("模型中的系数分布")

对于原始数据系数进行饼图分析看出,师资力量占比很大,其次是校友就业 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

X.AI666

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

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

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

打赏作者

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

抵扣说明:

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

余额充值