黄磊 副教授

个人信息Personal Information


出生日期:1987-05-29

入职时间:2015-08-28

学历:博士研究生毕业

办公地点:交大犀浦校区第三号教学楼30439室

性别:

在职信息:在岗

主要任职:数学学院院长助理

其他任职:Supervisor of graduate students

毕业院校:新加坡国立大学

学科:数学. 统计学

所在单位:数学学院

报考该导师研究生的方式

欢迎你报考黄磊老师的研究生,报考有以下方式:

1、参加西南交通大学暑期夏令营活动,提交导师意向时,选择黄磊老师,你的所有申请信息将发送给黄磊老师,老师看到后将和你取得联系,点击此处参加夏令营活动

2、如果你能获得所在学校的推免生资格,欢迎通过推免方式申请黄磊老师研究生,可以通过系统的推免生预报名系统提交申请,并选择意向导师为黄磊老师,老师看到信息后将和你取得联系,点击此处推免生预报名

3、参加全国硕士研究生统一招生考试报考黄磊老师招收的专业和方向,进入复试后提交导师意向时选择黄磊老师。

4、如果你有兴趣攻读黄磊老师博士研究生,可以通过申请考核或者统一招考等方式报考该导师博士研究生。

点击关闭

教师博客

当前位置: 中文主页 >> 教师博客

数据会聊天之用Python实现随机森林

##本期展示的数据分析例子和第一期逻辑回归相似,也是关于研究生录取,但有区别。今天的因变量Y={0,1,2},其中0表示不录取,1表示有待考虑,2表示直接录取。因此用简单的二元分类逻辑回归肯定不行,这里我们也不再使用多类别逻辑回归了,因为第一期里面我们说过逻辑回归的预测能力并不强。本期我们就展示应用非常广的一种集成学习方法随机森林,森林是由许多树组成的,如果没有树木只有草,那不叫森林,叫大草原。所以随机森林,就是随机地种许多树,什么树呢?决策树!因此随机森林除了可用于分类,当然也可以用于回归。


##加载程序包
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier # 随机森林程序包
from sklearn import metrics
import seaborn as sbn #数据可视化包
import tkinter as tk  #制作GUI的程序包
import matplotlib.pyplot as plt


df=pd.read_csv("D:/mypy/admit.csv") # 数据我存在自己电脑D盘mypy文件夹里,读者可从附件下载
df.describe() #描述统计

df.hist() # 变量直方图

X=df[['gmat','gpa','wy','age']] # 自变量
y=df['admit']  # 因变量


##训练和预测
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.25,random_state=23) #原始数据分为训练集测试集
clf = RandomForestClassifier(n_estimators=100)# 森林里100棵树
clf.fit(X_train,y_train)   #训练集上拟合
y_pred=clf.predict(X_test) # 测试集上预测

##准确率展示
pd.DataFrame({'Y_test':y_test, 'Y_pred':y_pred}) #预测值与真实值对比

confusion_mat=pd.crosstab(y_test, y_pred, rownames=['Actual'],colnames=['Prediction']) #预测值与真实值列联表

confusion_mat

plt.figure()
sbn.heatmap(confusion_mat, annot=True) #热力图

print('Accuracy:', metrics.accuracy_score(y_test, y_pred))# 准确度计算,100%,运气好!

#读者可尝试修改一下test_size或者random_state,或者修改树的数目,可能会得到不同结果

##新值预测
prediction=clf.predict([[730, 3.7, 4, 27]]) # 一位申请者,GMAT=730分,GPA=3.7, 工作4年,27岁
print('Predicted:',prediction) #预测结果是“2”录取

##制作一个简单GUI
root=tk.Tk()
canvas1 = tk.Canvas(root, width = 500, height = 350)
canvas1.pack()
# GMAT
label1 = tk.Label(root, text='                       GMAT:')
canvas1.create_window(100, 100, window=label1)

entry1 = tk.Entry (root)
canvas1.create_window(270, 100, window=entry1)

# GPA
label2 = tk.Label(root, text='            GPA:   ')
canvas1.create_window(120, 120, window=label2)

entry2 = tk.Entry (root)
canvas1.create_window(270, 120, window=entry2)

# work_experience
label3 = tk.Label(root, text='     Work Years:  ')
canvas1.create_window(140, 140, window=label3)

entry3 = tk.Entry (root)
canvas1.create_window(270, 140, window=entry3)

# Age input
label4 = tk.Label(root, text='Age:  ')
canvas1.create_window(160, 160, window=label4)

entry4 = tk.Entry (root)
canvas1.create_window(270, 160, window=entry4)

def values():
    global gmat
    gmat = float(entry1.get())
    
    global gpa
    gpa = float(entry2.get())
    
    global work_experience
    wy= float(entry3.get())
    
    global age
    age = float(entry4.get())
    
    Prediction_result  = ('  Predicted Result: ', clf.predict([[gmat,gpa,wy,age]]))
    label_Prediction = tk.Label(root, text= Prediction_result, bg='sky blue')
    canvas1.create_window(270, 280, window=label_Prediction)
    
button1 = tk.Button (root, text='      Predict      ',command=values, bg='green', fg='white', font=11)
canvas1.create_window(270, 220, window=button1)
 
root.mainloop()  #到此制作GUI的程序完毕,见效果图如下 

# 这样一位27岁,有4年工作经验,GMAT考730分, GPA为3.7的申请者,我们的模型很看好他,那么到底他的哪个特征对其录取贡献最大呢?这就是下面要解决的问题了。由以下结果,我们可知,年龄最不被看重,而GMAT成绩是最被看重的。


##变量重要度
featureImportances = pd.Series(clf.feature_importances_).sort_values(ascending=False)#随机森林可以对自变量的重要度进行计算
print(featureImportances)
fig=sbn.barplot(x=round(featureImportances,4), y=featureImportances) #用条形图对比一下重要度,原来是GMAT最重要
fig.set(xticklabels=['Age','Work Year','GPA','GMAT'])
plt.xlabel('Features Importance')
plt.show()

附件: