@Author:By Runsen
數據集摘要:
鏈接: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``matplotlib和
pandas讀取
Admission_Predict.csv`
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
列的相關係數。
對應特徵數據,總有一些不影響是否入學的無用特徵,通過繪製相關係數矩陣去除無關特徵
fig,ax = plt.subplots(figsize=(10, 10))
sns.heatmap(df.corr(), ax=ax, annot=True, linewidths=0.05, fmt= '.2f',cmap="magma")
plt.show()
從Research、LOR和SOP的值看出存在很多小於0.5的相關係數,即黑塊出現多的地方的特徵,應該去除
特別是Research數據,可能大多數候選人都有研究經驗,但是不能代表都能入研究生
相反CGPA、GRE Score和TOEFL Score相對與Research、LOR和SOP
相關係數較大,與結果可能有關係
結論:Research將成爲入學機會的一個特別不重要的特徵
分析Research相對應的數據分佈
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:託福成績
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分數頻率分佈圖
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之間。在這個範圍以上是候選人脫穎而出的一個很好的特徵。
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
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分數
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、劃分數據集
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
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
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
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.ensemble
i導入RandomForestRegressor
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-yaFsor79-1582338262119)(./image/15.png)]
7、比較三種算法
red | (線性迴歸) |
---|---|
green | (隨機森林) |
blue | (迴歸樹) |
black | (真實數據) |
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、讀取數據
test_df =pd.read_csv("Admission_Predict_Ver1.1.csv",sep = ",",index_col='Serial No.')
2、查看數據
3、預測數據
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")
結果如下: