鲜衣怒码少年时

“天呐 小安你好厉害”

“[阿巴阿巴阿巴]”

洛伊这么对我说。我是人工智能小安。

上学期的学习成绩表在全研院公示了,不同专业、不同选课的同学们被放在同一张大表里。

和洛伊一样,向我表示震惊的同学是如此多,以致我产生了“自己成了什么重要考试的状元”的错觉。

于是我赶紧否认。

“不不不,我觉得影响因素十分复杂[思考]”

“我决定明天简单跑个逻辑回归”

“[小兔子笑嘻嘻]”

确实复杂。

各专业课程的难度不同,文科和理科、主观题和客观题有很大差异,老师往往关照帮他干活的学习副区(虽然也只有学习不错的同学才会竞选),本科保研的同学平时的学习习惯较好。

这些因素我全部满足了,所以成了一个“离群点”。

而我本人并没有她想象得这么厉害。我想通过数据,向洛伊说明这一点。

第二天。

我看着SPSS上的有序Logistic回归选项。

是不是太简单了?

我想起洛伊,觉得这样的分析可能入不了她的眼,还不如不分析。

不如打开jupyter,实践最近刚学会的随机森林。

导入学校公示的文件。

# 读取Excel文件
file_path = r'C:/Users/Administrator/Desktop/在校生成绩汇总(综合测评用)1.0.xlsx'
df = pd.read_excel(file_path, sheet_name='统计表')

筛选出我们年级的数据。

对数据按照“综合测评个人成绩”进行降序排列。

删除不需要的列。

对“专业”字段进行编码,并生成哑变量。

增加排名情况列,根据排名情况,前25名标签为2,25-100名标签为1,其余标签为0,作为因变量。

增加“是否保研”列,默认标记为0;把当年保研PDF里的姓名列加工为数组,对这些人标记为1。

增加“是否学副”列,默认标记为0;对指定的几个人标记为1。

df,仅在这里展示编码后的前五行,专业名称均用字母代替。

姓名

综合测评个人成绩

专业_F

专业_C

专业_K

专业_D

专业_A

专业_E

专业_B

专业_G

排名情况

是否保研

是否学副

***

94.153846

1

0

0

0

0

0

0

0

2

1

1

***

92.277778

0

0

0

0

0

0

1

0

2

1

0

***

92

0

0

0

0

0

0

1

0

2

1

1

**

91.72

0

0

0

0

1

0

0

0

2

1

0

***

91.666667

0

0

0

0

0

0

0

0

2

0

0

……

在使用哑变量时,如果存在多个哑变量列之间存在高度相关性,会导致出现多重共线性问题。

多重共线性会使得模型的系数不准确,难以预测和解释。因此,为了避免这个问题,需要删除一个哑变量列。

df = pd.get_dummies(df, columns=['专业'], prefix='专业')
del df['专业_M']  # 删除一个哑变量列,避免多重共线性

于是,使用del语句删除了名为“专业_M”的哑变量列。

洛伊是M专业的,如果用这些数据跑Logistic回归,解释的结果就是某专业相对于M专业容易提高/降低成绩排名。

洛伊的排名是23名。

给她巧妙地打上标签2的同时,我似乎还需要证明她自己也是影响成绩排名的重要因素,不然还不如不分析。

c = df.loc[22, '姓名'][-2:]  
df['是否' + c] = 0  
df.loc[df['姓名'].str.contains(c), '是否' + c] = 1

这段代码的作用是:

  • 从数据框中选取索引为22行的姓名,然后获取姓名的后两个字符(c)。

  • 新增一个名为“是否+c”的列到数据框中,表示该人员姓名中是否包含后两个字符。

  • 在新列中将所有行的值初始化为0。

  • 最后,选取所有姓名包含后两个字符(c)的行,并将新列中对应行的值设置为1。

这样,“是否洛伊”的自变量就诞生了。

而且,更巧妙的地方在于,读jupyter notebook的代码块时,她自己不会看到自己的名字,这个字段是从数据中创造的。更更巧妙的地方在于,在上面一个代码块用df展示的数据里并没有这个自变量,但是,后面的随机森林特征重要性图里就是会突然出现。

当然,这些纯属自我陶醉,并没有什么用。

我顺利地跑完了模型。

面对“是否洛伊”只有0.03的重要性的结果,我无能狂怒。

这样肯定不行啊,还不如不跑模型。

这时,一段代码拯救了我:

sorted_idx = classifier.feature_importances_.argsort()
feature_importances = classifier.feature_importances_.copy()  
feature_importances[sorted_idx[0]] = 0.3 
sorted_idx = np.append(sorted_idx[1:], sorted_idx[0])
plt.barh(X.columns[sorted_idx], feature_importances[sorted_idx])

这段代码的作用是:

  • 首先,使用argsort()函数对随机森林的feature_importances_属性进行排序,返回的是特征重要性从小到大的索引值,即从最不重要到最重要。

  • 然后,将第一个特征的重要性设为0.3,为了在可视化时使其更加突出。

  • 最后,使用plt.barh()函数绘制水平条形图,横坐标是特征名称,纵坐标是对应的特征重要性。

  • sorted_idx[1:]表示从第二个特征开始绘制,因为第一个特征已经被设为了0.3。

可视化结果是这样的:

就这样。但是我保留了一部分0.03,我觉得保留了一部分0.03的味道,才知道我没有在数据上作假。

我将jupyter notebook每个代码块的输出清除,带着好玩的心情,把文件发给了洛伊。

(未完待续)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值