Python大数据分析1:数据分类分析(企业欺诈识别)

数据分类是一种机器学习的数据预测方法。

在这里,我们谈到的机器学习。大家可能会觉得有点畏惧,觉得是不是很难。我们首先需要对它有个简单的了解:第一,机器学习是一些计算机分析方法的统称,虽然很难,但是Python已经提供了很多很好用的库,我们只需学会如何使用即可,正如相机拍照原理和过程很复杂,但是我们只需按动那个快门键;第二,机器学习方法不同于前面我们介绍的一些基于现有数据进行总结性分析的方法,这些方法或者通过表格,或者通过可视化,提供给大家一种了解现有数据的分析途径。机器学习分析方法更强调智能性,甚至可以对未知数据进行预测分析,这些能力非常强大。

这次我们就先看看分类。在这里,数据分类有着明确的规定,即对于一组数据,我们事先对它们进行一种分类标注,然后通过一些诸如机器学习等分析方法,了解这种分类背后的数据规律,并由该机器学习分析方法自动预测新数据的类别。

我们从一个例子开始。加利福尼亚大学提供了一组免费的公开数据集合,其中提供了各种分析功能适用的数据:其中有三百多种分类目的的数据,我们选择分类数据,进一步选择其中的企业审计数据(Audit Data),此时点击Download后面的Data Folder数据文件夹,即可在打开的界面中选择Audit_Data.zip数据文件即可。

这个数据2015年至2016年间一些公司非机密数据,根据诸如环境状况报告、利润价值记录等信息,预测公司的欺诈可能性,共计26个数据列。这个可能性主要通过最后一列的Risk可以看出,为1表示存在风险,为0表示不存在风险。

接下来,我们需要解释一下如何进行分类分析。和所有其他机器学习方法差不多,都是一种常见的流程。我们接来下就按照这个流程来说明下:

首先是数据获取加载。

我们还是通过pandas读取数据:

import pandas as pd

frame = pd.read_csv(‘C:\\temp\\audit_risk.csv’)

print(frame)

第二步是数据预处理。不同的机器学习方法可能对数据有着不同的要求,比如一般的分类方法,要求所有参与计算的列必须是数值型,同时还可能要求数据不能有缺失的空值。

事实上,这个数据是有些小问题的。

首先我们可以观察下有无非数值型数据。具体Python处理方法我们后面专门来讲,这里我们就不做过多介绍。不过即使如此,我们也可以使用最为常见的Excel来查找下。

在Excel中按下Ctrl+A选中全部记录,按下Ctrl后再点击下第一行,你会发现选择内容去除了第一行的标题,在Excel中直接按下Ctrl+F查找,即可在选择的数据内容中查找,在定位中选择常量下的文本,去除其他选择项目,点击定位即可。此时可以看到已有三块数据被选中,为灰色,建议直接替换为0。同样的方法,在定位中选择空值,也可以快速看到存在的空值记录,建议使用0填充。到此为此,数据预处理手工完成。

第三步是数据划分。这里包括两个操作,一是数据列的划分,将现有数据分为特征列和预测列,也就是说,你准备按照什么数据进行分类,即特征列,这里应该就是除了最后一列外所有的企业数据特征列。分好的类在哪个列标记,即类别类,也是将来准备预测类别的列,因此也可以称之为预测列。这里就是最后一列,取值为0或者1的Risk。

写成代码的形式就是:

import pandas as pd

frame = pd.read_csv(‘C:\\temp\\audit_risk.csv’, header=0)

y = frame[frame.columns[len(frame.columns) – 1]]

frame.drop(frame.columns[len(frame.columns) – 1], axis=1, inplace=True)

X = frame

print(X)

这里首先取出最后一列,按照习惯,预测列名称通常为小写的y。其中这里我们没有使用列名的方法,故意使用了另外一种方法,即按照最后一列的序号来取出相应的列,根据当前列的个数减一可以得到最后一列的序号,因为从零开始表示第一列。然后根据这个序号得到相应的列,这种用法在没有列名的时候比较灵活。然后再删除最后一列,这里没有保存Frame,而且直接通过inplace参数直接在原有DataFrame上删除,axis为1表示以列为单位操作,而第一个参数正是最后一列的序号。按照习惯,特征列名称通常为大写的X。

第二个数据行的划分,主要目的是分为训练集和测试集合。所谓训练集合,是指使用哪些数据来训练分类算法。这些分类模算法必须在一些给定的数据中去训练,或者说去学习,才能自动获取最能反映分类的规则,并保存到分类模型中。一般会把整体数据的大部分作为训练集合,不能太小,否则训练效果会较差。所谓测试集合,主要是用来评估分类算法,看看拿刚才的模型来预测下,比如这里预测下分类结果,看看和已知的结果是否一致,显然越一致算法越好。通常这部分数据较少。到了真实应用场景下,就可以拿真正想预测的数据作为测试集合。

看起来很复杂,其实很简单,我们再次使用一个著名的Python库,叫sklearn,它是目前非常著名的一个实现各种机器学习方法的库。还像以前一样导入到项目,代码为:

import pandas as pd
from sklearn.model_selection import train_test_split

frame = pd.read_csv('C:\\temp\\audit_risk.csv', header=0)
y = frame[frame.columns[len(frame.columns) - 1]]
frame.drop(frame.columns[len(frame.columns) - 1], axis=1, inplace=True)
X = frame

X_train, X_test, y_train, y_test = train_test_split(X, y)
print(X_train.shape)
print(X_test.shape)
print(y_train.shape)
print(y_test.shape)

其中首先导入sklearn中专门用于划分训练集和测试集的train_test_split类型,自动获得四块内容,正好对于特征列和预测列、训练集和测试集的四种组合。

这里输出了下大小,正好看出,所有X相关的特征数据都是26列,所有训练和测试的数据比例划分是3:1,大家看懂了这个结果吗?

也可以通过设置test_size改变默认的分隔设置:

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1)

test_size默认为0.25,表示测试集的比例。

好了,到了最关键的一步,即第四步,数据训练。就是根据上述分好的数据,利用训练集合相关的两块数据来计算、来学习,得到分类模型。

代码为:

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier

frame = pd.read_csv('C:\\temp\\audit_risk.csv', header=0)
y = frame[frame.columns[len(frame.columns) - 1]]
frame.drop(frame.columns[len(frame.columns) - 1], axis=1, inplace=True)
X = frame

X_train, X_test, y_train, y_test = train_test_split(X, y)
estimator = KNeighborsClassifier()
estimator.fit(X_train, y_train)

这里首先需要选择一个分类算法,我们选择了k近邻分类算法,生成一个分类器变量,记得此时需要导入这个分类算法。具体分类怎么实现的,我们无需过问,其实有很多不同的算法,后面我们还可以做出选择调整。

然后调用这个分类器变量的fit方法,里面正好就是训练集合的两块数据。

第五步,就是最后一步,效果评估。一般就是使用模型预测下,比如这里的分类预测,然后看看准确度。

代码为:

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
import numpy as np

frame = pd.read_csv('C:\\temp\\audit_risk.csv', header=0)
y = frame[frame.columns[len(frame.columns) - 1]]
frame.drop(frame.columns[len(frame.columns) - 1], axis=1, inplace=True)
X = frame

X_train, X_test, y_train, y_test = train_test_split(X, y)
estimator = KNeighborsClassifier()
estimator.fit(X_train, y_train)
y_predicted = estimator.predict(X_test)
print(np.mean(y_test == y_predicted))

这里仍然分类器的predict方法直接根据测试集的特征数据来预测。

如果进行效果比较呢?这里我们也无需直接去做,再次使用一个著名的科学计算库numpy,也记得导入,并在项目代码中导入,即可利用它的mean,即平均值,我们只需将预测的结果y_predicted和已知的y_test以是否相等作为条件,看看正确的占比有多少。此时,mean这个方法的参数是一个由真假组成的列表,它会自动计算True在其中的比例,作为平均值。这个预测结果的准确度还是挺高的!95%!

为了好看,我们可以再次改变下输出的格式:

print(“准确度为:{:.1f}%”.format(np.mean(y_test == y_predicted) * 100))

这里使用了字符串的格式化输出功能,其中整个字符串都会直接输出,而花括号括起来的部分,会以format函数中的结果来展示,而花括号里的内容就表示按照一位小数输出。

发表评论

电子邮件地址不会被公开。 必填项已用*标注