山东大学2019级机器学习实验一思路分析

山东大学2019级机器学习实验一思路分析

实验说明

山东大学2019级机器学习实验一思路分析_第1张图片

山东大学2019级机器学习实验一思路分析_第2张图片

中间的字段说明就不再写上了

实验分析

前提说明,默认大家已经掌握了贝叶斯模型是什么,怎么使用贝叶斯模型,不知道的可以点击链接查看添加链接描述。然后实验步骤依次如下:

  1. 数据预处理
  2. 训练模型,得到不同属性的概率
  3. 测试模型,运用概率去估测测试集并与结果比对得出精度

数据预处理

这里的数据预处理总共有四种,分别是补充缺失值、文字转成数值、日期格式、无关属性删除

补充缺失值

这次实验的缺失值比较特殊,一个是年份的位置(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的精度,个人感觉还可以。

山东大学2019级机器学习实验一思路分析_第3张图片

你可能感兴趣的:(机器学习,python,人工智能)