山东大学2019级机器学习实验一思路分析
实验说明
中间的字段说明就不再写上了
实验分析
前提说明,默认大家已经掌握了贝叶斯模型是什么,怎么使用贝叶斯模型,不知道的可以点击链接查看添加链接描述。然后实验步骤依次如下:
- 数据预处理
- 训练模型,得到不同属性的概率
- 测试模型,运用概率去估测测试集并与结果比对得出精度
数据预处理
这里的数据预处理总共有四种,分别是补充缺失值、文字转成数值、日期格式、无关属性删除
补充缺失值
这次实验的缺失值比较特殊,一个是年份的位置(work_year)有缺失值,剩下有缺失值的位置位于f0-f4以及pub_dero_bankrup。补充可以采取pandas内置函数。inplace=true可以直接改变df中的值
df['work_year'].fillna(0, inplace=True)
df['f0'].fillna(0, inplace=True)
df['f1'].fillna(0, inplace=True)
df['f2'].fillna(0, inplace=True)
df['f3'].fillna(0, inplace=True)
df['f4'].fillna(0, inplace=True)
df['pub_dero_bankrup'].fillna(0, inplace=True)
文字转成数值
这个没用到
日期格式
这个我把日期直接当成无关属性了,如果加上精度可能会更高。我可以提供思路,自己懒得写了,对于Series,可以使用describe函数获取日期的起始日期,算一个日期差,然后离散化处理即可。
无关属性删除
这个也是之前把我误导到一个误区的地方,误以为这个应该在训练中不断调整,也就是说,一开始确定一些属性为有关属性,然后依次增加属性,看精度的变化,如果精度有提升,就加入该属性,如果下降,就不加入该属性。后来,当我和王一讨论的时候才发现,无关属性删除在预处理中操作的,也就是说选什么属性有我们自己来定,这个选择看个人了。
训练模型
大家其实一开始都很懵,模型都不知道是什么,怎么训练,输入输出是什么。这时候,我们要回归贝叶斯模型的定义,贝叶斯模型的输入是一个x,x具有很多属性,输出是它属于哪个类别,判断依据是不同属性的概率,所以说关键就在于概率。通过训练集,得到每个属性的不同取值的概率,就完成我们的任务了。但是这里会有两个问题,也就是说明中提到的。一个是连续数据离散化,另一个就是零概率平滑处理。
连续数据离散化
我认为的连续数据就是那个取值相对较多的数据(王一指导),然后离散化的方法可以使用上学期Python课上学到的pandas.cut
就可以进行离散化了,这里做一些修改,因为我们需要划分的区间,所以做一些修改得到区间
for _attribute in _Attributes:
temp = pd.cut(self.ds[_attribute], 4, labels=Labels, retbins=True)
self.ds[_attribute] = temp[0]
Intervals[_attribute] = list(temp[1])
零概率平滑处理
所谓零概率事件,就是测试集属性的取值在训练集中没有,这里处理的方式是询问商志达和王一得到的——拉普拉斯修正(百度了解一下),在训练集得到概率的时候,计算ELSE概率作为没有出现的属性取值的概率。具体代码如下
num = len(temp) + len(categories) + 1
for category in categories:
Probability[attribute][1][category] = (counts[category] + 1) / num
Probability[attribute][1]['ELSE'] = 1 / num
测试模型
这个应该就不用在多说了,就是每次取出一行,通过之前得到的区间对连续值进行离散化处理,然后计算1和0的概率作比较,就可以了
个人结果
我这边用了一些我认为有用的数据,得到了92.1的精度,个人感觉还可以。
|