前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >kaggle | 研究生入学率预测

kaggle | 研究生入学率预测

作者头像
润森
发布2020-02-25 11:53:46
3.3K0
发布2020-02-25 11:53:46
举报
文章被收录于专栏:毛利学Python毛利学Python

@Author:By Runsen

原文:https://maoli.blog.csdn.net/article/details/104439681

数据集摘要:

链接:https://www.kaggle.com/mohansacharya/graduate-admissions

名称

Graduate Admission

特征简介

1. GRE分数(340分)2.托福分数(120分)3.大学等级(5分)4.目的说明和推荐信(5分)5.本科GPA(满分10分)6.研究经验(0或1)7.录取几率(0到1)

记录数

400

分析目标

提出问题,描述分析目标

分析思路及方法

概述分析思路及方法

一、简介

该数据集的灵感来自UCLA研究生数据集。考试成绩和GPA采用较旧的格式。该数据集归Mohan S Acharya所有。

数据集从印度的角度预测研究生入学率,包含几个在申请硕士课程期间被认为重要的参数。其中包括以下参数:

中文名称

英文名称

序列号

Serial No.

GRE成绩

GRE Score

托福成绩

TOEFL Score

大学等级

University Rating

标准操作程序

SOP

劳尔

LOR

CGPA

CGPA

研究

Research

录取机会

Chance of Admit

在数据集中Admission_Predict.csv是数据分析的文件

二、数据读取

1、数据处理环境

Anaconda(官方网站)就是可以便捷获取包且对包能够进行管理,同时对环境可以统一管理的发行版本。Anaconda包含了conda、Python在内的超过180个科学包及其依赖项。

2、数据读取方法

在数据分析工作中,Pandas 的使用频率是很高的,一方面是因为 Pandas 提供的基础数据结构 DataFrame 与 json 的契合度很高,转换起来就很方便。

pandas库支持csv和excel的操作;使用的是pd.read_csv的函数

导入numpy,·seaborn``matplotlibpandas读取Admission_Predict.csv`

代码语言:javascript
复制
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
df = pd.read_csv("Admission_Predict.csv",sep = ",",index_col='Serial No.')
查看df.head
查看df.info

df.info可以看见并无缺失数据

查看df.describe

数据中的std标准差都比较小,说明数据集的离散程度影响不大,分布程度上比较集中

三、 数据预处理

1、绘制相关系数矩阵

相关矩阵第i行第j列的元素是原矩阵第i列和第j列的相关系数。

对应特征数据,总有一些不影响是否入学的无用特征,通过绘制相关系数矩阵去除无关特征

代码语言:javascript
复制
fig,ax = plt.subplots(figsize=(10, 10))
sns.heatmap(df.corr(), ax=ax, annot=True, linewidths=0.05, fmt= '.2f',cmap="magma")
plt.show()

ResearchLOR和SOP的值看出存在很多小于0.5的相关系数,即黑块出现多的地方的特征,应该去除

特别是Research数据,可能大多数候选人都有研究经验,但是不能代表都能入研究生

相反CGPAGRE ScoreTOEFL Score相对与ResearchLOR和SOP

相关系数较大,与结果可能有关系

结论:Research将成为入学机会的一个特别不重要的特征

分析Research相对应的数据分布

代码语言:javascript
复制
print("Not Having Research:",len(df[df.Research == 0]))
print("Having Research:",len(df[df.Research == 1]))
y = np.array([len(df[df.Research == 0]),len(df[df.Research == 1])])
x = ["Not Having Research","Having Research"]
plt.bar(x,y)
plt.title("Research Experience")
plt.xlabel("Canditates")
plt.ylabel("Frequency")
plt.show()

正如我们所料,在400人中Having Research: 219,219有研究经验,但是219中并不是都入选研究生

下面具体分析CGPA、GRE Score和TOEFL Score

TOEFL Score托福成绩

代码语言:javascript
复制
y = np.array([df["TOEFL Score"].min(),df["TOEFL Score"].mean(),df["TOEFL Score"].max()])
x = ["Worst","Average","Best"]
plt.bar(x,y)
plt.title("TOEFL Scores")
plt.xlabel("Level")
plt.ylabel("TOEFL Score")
plt.show()

托福最低分为92分,托福最高分为120分。平均107.41。

2、数据分析

CGPA分数

绘制CGPA分数频率分布图

代码语言:javascript
复制
df["GRE Score"].plot(kind = 'hist',bins = 200,figsize = (6,6))
plt.title("GRE Scores")
plt.xlabel("GRE Score")
plt.ylabel("Frequency")
plt.show()

概率密度介于310和330之间。在这个范围以上是候选人脱颖而出的一个很好的特征。

代码语言:javascript
复制
plt.scatter(df["University Rating"],df.CGPA)
plt.title("CGPA Scores for University Ratings")
plt.xlabel("University Rating")
plt.ylabel("CGPA")
plt.show()

绘制了CGPA和University Rating数据分布

结论1:随着大学质量的提高,CGPA分数也随之提高。可能大学的名声越大,学生的CGPA分数越高
结论2:大学录取率为75%的考生的大学等级基本大于3
代码语言:javascript
复制
df=df.rename(columns = {'Chance of Admit ':'Chance of Admit'})
s = df[df["Chance of Admit"] >= 0.75]["University Rating"].value_counts().head(5)
plt.title("University Ratings of Candidates with an 75% acceptance chance")
s.plot(kind='bar',figsize=(20, 10))
plt.xlabel("University Rating")
plt.ylabel("Candidates")
plt.show()
结论3:GRE分数高的个体通常有较高的CGPA分数
代码语言:javascript
复制
plt.scatter(df["GRE Score"],df.CGPA)
plt.title("CGPA for GRE Scores")
plt.xlabel("GRE Score")
plt.ylabel("CGPA")
plt.show()

GRE分数高的个体中也存在有较低的CGPA分数

四、数据建模

1、scikit-learn介绍

scikit-learn(简记sklearn),是用python实现的机器学习算法库。sklearn可以实现数据预处理、分类、回归、降维、模型选择等常用的机器学习算法。sklearn是基于NumPy, SciPy, matplotlib的。

2、划分数据集
代码语言:javascript
复制
y = df["Chance of Admit"].values
x = df.drop(["Research","LOR ","SOP","Chance of Admit"],axis=1)

# separating train (80%) and test (%20) sets
from sklearn.model_selection import train_test_split

x_train, x_test,y_train, y_test = train_test_split(x,y,test_size = 0.20,random_state = 42)
3、缩放数据

正则化方法是在训练数据不够多时,或者overtraining时,常常会导致过拟合(overfitting)。这时向原始模型引入额外信息,以便防止过拟合和提高模型泛化性能的一类方法的统称。

只需导入sklearn.preprocessing中的MinMaxScaler

代码语言:javascript
复制
from sklearn.preprocessing import MinMaxScaler
scalerX = MinMaxScaler(feature_range=(0, 1))
x_train[x_train.columns] = scalerX.fit_transform(x_train[x_train.columns])
x_test[x_test.columns] = scalerX.transform(x_test[x_test.columns])
4、线性模型

线性模型是一类统计模型的总称,制作方法是用一定的流程将各个环节连接起来

导入sklearn.linear_model中的LinearRegression

模型评估:在常用的回归评估指标包括:

  • r2_score
  • explained_variance_score

这里使用的是r2_score

R2 决定系数(拟合优度)

模型越好:r2→1

模型越差:r2→0

代码语言:javascript
复制
from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(x_train,y_train)
y_head_lr = lr.predict(x_test)

print("real value of y_test[1]: " + str(y_test[1]) + " -> the predict: " + str(lr.predict(x_test.iloc[[1],:])))
print("real value of y_test[2]: " + str(y_test[2]) + " -> the predict: " + str(lr.predict(x_test.iloc[[2],:])))

from sklearn.metrics import r2_score
print("r_square score: ", r2_score(y_test,y_head_lr))

y_head_lr_train = lr.predict(x_train)
print("r_square score (train dataset): ", r2_score(y_train,y_head_lr_train))
5、决策树

决策树常用于分类问题,但是也能解决回归问题。

sklearn.tree 导入DecisionTreeRegressor

代码语言:javascript
复制
from sklearn.tree import DecisionTreeRegressor
dtr = DecisionTreeRegressor(random_state = 42)
dtr.fit(x_train,y_train)
y_head_dtr = dtr.predict(x_test)

from sklearn.metrics import r2_score
print("r_square score: ", r2_score(y_test,y_head_dtr))
print("real value of y_test[1]: " + str(y_test[1]) + " -> the predict: " + str(dtr.predict(x_test.iloc[[1],:])))
print("real value of y_test[2]: " + str(y_test[2]) + " -> the predict: " + str(dtr.predict(x_test.iloc[[2],:])))

y_head_dtr_train = dtr.predict(x_train)
print("r_square score (train dataset): ", r2_score(y_train,y_head_dtr_train))
6、 随机森林

随机森林是指利用多棵决策树对样本进行训练并预测的一种算法。

sklearn.ensemblei导入RandomForestRegressor

代码语言:javascript
复制
from sklearn.ensemble import RandomForestRegressor
rfr = RandomForestRegressor(n_estimators = 100, random_state = 42)
rfr.fit(x_train,y_train)
y_head_rfr = rfr.predict(x_test)

from sklearn.metrics import r2_score
print("r_square score: ", r2_score(y_test,y_head_rfr))
print("real value of y_test[1]: " + str(y_test[1]) + " -> the predict: " + str(rfr.predict(x_test.iloc[[1],:])))
print("real value of y_test[2]: " + str(y_test[2]) + " -> the predict: " + str(rfr.predict(x_test.iloc[[2],:])))


y_head_rf_train = rfr.predict(x_train)
print("r_square score (train dataset): ", r2_score(y_train,y_head_rf_train))

img

7、比较三种算法

red

(线性回归)

green

(随机森林)

blue

(回归树)

black

(真实数据)

代码语言:javascript
复制
red = plt.scatter(np.arange(0,80,5),y_head_lr[0:80:5],color = "red")
green = plt.scatter(np.arange(0,80,5),y_head_rfr[0:80:5],color = "green")
blue = plt.scatter(np.arange(0,80,5),y_head_dtr[0:80:5],color = "blue")
black = plt.scatter(np.arange(0,80,5),y_test[0:80:5],color = "black")
plt.title("Comparison of Regression Algorithms")
plt.xlabel("Index of Candidate")
plt.ylabel("Chance of Admit")
plt.legend((red,green,blue,black),('LR', 'RFR', 'DTR', 'REAL'))
plt.show()

从图中可以看出:线性回归是最好的回归算法。(观察谁靠近黑色的数据)

7、结论:线性回归是最好的回归算法。

五、预测数据

在数据集中有一个Admission_Predict_Ver1.1.csv文件没有Admit数据

现在使用线性回归模型来预测数据

1、读取数据
代码语言:javascript
复制
test_df =pd.read_csv("Admission_Predict_Ver1.1.csv",sep = ",",index_col='Serial No.')
2、查看数据
3、预测数据
代码语言:javascript
复制
test_x = test_df.drop(["Research","LOR ","SOP","Chance of Admit "],axis=1)
test_x[test_x.columns] = scalerX.transform(test_x[test_x.columns])
test_df['Admit']= lr.predict(test_x)
test_df.to_csv("预测结果.csv")

结果如下:

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-02-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小刘IT教程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、简介
  • 二、数据读取
    • 1、数据处理环境
      • 2、数据读取方法
      • 三、 数据预处理
        • 1、绘制相关系数矩阵
          • 2、数据分析
          • 四、数据建模
          • 五、预测数据
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档