作者:张扬

2017年7月8日,国务院印发了《新一代人工智能发展规划的通知》(国发[2017]35号)。此文件提出共分三步走的战略目标:第一步,到2020年人工智能总体技术和应用与世界先进水平同步,人工智能产业成为新的重要经济增长点,人工智能技术应用成为改善民生的新途径,有力支撑进入创新型国家行列和实现全面建成小康社会的奋斗目标。第二步,到2025年人工智能基础理论实现重大突破,部分技术与应用达到世界领先水平,人工智能成为带动我国产业升级和经济转型的主要动力,智能社会建设取得积极进展。第三步,到2030年人工智能理论、技术与应用总体达到世界领先水平,成为世界主要人工智能创新中心,智能经济、智能社会取得明显成效,为跻身创新型国家前列和经济强国奠定重要基础。这是国家高瞻远瞩的雄心壮志,也是我们为之奋斗的长久目标。
人工智能固然强大,可是怎样实验人工智能呢?机器学习就是人工智能的基本做法,它使用算法来解析数据、从中学习,然后对真实世界中的事件做出决策和预测。与传统的为解决特定任务、硬编码的软件程序不同,机器学习是用大量的数据来“训练”,通过各种算法从数据中学习完成任务。
众所周知,2016年Google公司的AlphaGo战胜了李世石,举世震惊。从穷举组合复杂度来讲,围棋有10的172次方变化,据说这个数值比这个宇宙中存在的原子数还多,单凭穷举是不可能完成的。更重要的是,围棋讲究势,讲究大局,而这些正是软件程序的弱项。AlphaGo 采用了全新的深度学习算法,它模拟了人类的思维,自身拥有学习能力,它能根据海量的棋谱,以及对高手的对决,“左右互搏”不断地成长与完善。人类休息,AlphaGo不休息;人类有情绪,机器学习没有情绪。近期出现的人脸识别、无人驾驶,乃至机器人、智能医疗都来源于机器学习。可以这么说,任何一种需要人类智慧完成的工作,人工智能都会完成的比人类完成的更好。不掌握机器学习与神经网络,就等于主动放弃了“智能革命”,从而无法跟上时代,无法适应社会的需求。
在税务工作中,每个岗位每天都要面对大量的数据。对这些数据进行核实、比对、清分、测算,以及后序的税负测算、风险应对等,占用了税务人员的大量时间。人工智能说到根本,还是用机器模拟人类的思考方式,从而实现智能,把人从繁杂细碎的工作中解脱出来。笔者常常思考:既然机器学习可以判别乳腺癌、可以给房子估价,那在实际工作中,一定可以分析企业的报表数据,加强征管工作质量。此文即是一个小小的实践,旨在抛砖引玉,引起大家的头脑风暴。
目前比较常用的深度学习框架有TensorFlow、Keras、scikit-learn(以下简称sklearn)等,无论哪一种都可以处理目前市局征管的案头分析工作。而人工智能所需要的编程语言也不拘一格,如Python,R,C等等。本文之所以选择Python + sklearn是因为在机器学习和数据挖掘的领域中,这两者学习资源丰富,认知度较高,在数据量不是过大的情况下,可以解决大部分问题。
注:表1是省局下发的风控任务,表2是税源管理平台导出的,带核查结果。

1.  import pandas as pd  
2.  import numpy as np  
3.    
4.  #读取数据  
5.  df = pd.read_excel('表2.xlsx')  
6.  print(df.columns)  
7.    
8.  #将列名转化成数字  
9.  df.columns = list(range(len(df.columns)))  
10. print(df.columns)  

如果用 python 的列表和字典来比较, 那么可以说 Numpy 是列表形式的,而 Pandas 就是字典形式。Pandas是基于Numpy构建的,让Numpy为中心的应用变得更加简单。上文导入这两个库,并且将“表2.xlsx”赋值给df.

1.  #提取识别号和所得税两列数据  
2.  query_data = df[[6,15]].ix[1:]  
3.  query_data.columns= ['id','tax']  
4.  #剔除所得税为0的行  
5.  query_data = query_data[(query_data.tax != '0')]  
6.  query_data.head()  

表2中的第7列,即索引中[6,15]中的“纳税人识别号”将与表1中的“纳税人识别号”一一对应,此时将其取出,并将第16列中不等于0,即在核查中有税款入库的数据取出。

1.  #读取数据  
2.  df = pd.read_excel('表1.xls')  

此时将表1赋值给df

1.  #提取有用的数据列  
2.  base_data = df[['纳税人识别号', '营业收入', '营业成本', '营业税金',  
3.         '销售费用', '管理费用', '财务费用', '营业利润', '销售工资',  
4.         '管理工资', '全部工资', '销售折旧', '管理折旧', 'MAX(全部折旧)', '期末存货额', '期初存货额', '应纳税所得额',  
5.         '应纳税额', '增值税申报表附表2第12栏金额合计数累计', '增值税申报表附表2第28栏金额', '取前两列之和',  
6.         '收到的增值税发票开具额', '增值税最大额(取前两列最大值)', '外省普通发票', '数据仓库普通发票', '电子底账普通发票',  
7.         '普通发票最大(取AE和AF列最大值,增值税普通发票)', '固定资产购入', '地税代开发票',  
8.         '地税自开发票', '大厅代开老发票', '通用机打老发票(小规格发票)', '无票成本合计', '有票成本合计', '应税收入合计',  
9.         '调查额度', '占比','注册资本', '从业人数', '资产总额',  
10.        '一般人标志','人均月工资', '工资占收入比']]  

将表1中的表头赋值给base_data

1.  #将设别号存入集合,方便查询  
2.  id_set =set(list(query_data['id']))  
3.    
4.  def query(id):  
5.      #两表之间通过id进行查询  
6.      #如果第一个表中存在该id,则返回该行,否则返回nan  
7.      if id in id_set:  
8.          row = query_data[query_data.id == id].values[0,1]  
9.          return row  
10.     else :  
11.         return np.nan  

判断id,即“纳税人识别号”是否为空

1.  #表二增加一列  
2.  base_data['tax'] = 0  
3.  # print(base_data.head())  
4.  #遍历表二,对每行进行查询,并添加所得税数据  
5.  for i in range(base_data.shape[0]):  
6.      result = query(base_data['纳税人识别号'][i])  
7.      base_data.loc[i,'tax'] = result  

利用循环将评估出税款的纳税人识别号全部取出

1.  #清除空数据  
2.  base_data.dropna(inplace=True)  
3.  base_data.head()  

进行数据清洗,将未评估出税款的企业删除

1.  from sklearn import linear_model  
2.    
3.  from sklearn.model_selection import train_test_split  
4.  import matplotlib.pyplot as plt  
5.  from sklearn.preprocessing import StandardScaler  

导入sklearn和matplotlib两个包

1.  #提取X和y 用于回归计算  
2.  X = base_data.iloc[:,1:-1]  
3.  y = base_data.iloc[:,-1]  
4.  #对y四舍五入取整  
5.  y = round(y.astype(float))  
6.    
7.  X.head()  
1.  #分配训练集和测试集  
2.  X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=1) 
1.  #使用贝叶斯回归算法 拟合与预测  
2.  # model = linear_model.LinearRegression()  
3.  model = linear_model.BayesianRidge(tol=0.001)  
4.  # model = linear_model.LogisticRegression()  
5.  model.fit(X_train,y_train)  
6.  y_pre = model.predict(X_test)

贝叶斯线性回归的引入主要是在最大似然估计中很难决定模型的复杂程度,ridge回归加入的惩罚参数其实也是解决这个问题的,同时可以采用的方法还有对数据进行正规化处理,另一个可以解决此问题的方法就是采用贝叶斯方法

1.  #输出预测值与测试值之间的拟合程度  
2.  plt.figure()  
3.  plt.plot(range(len(y_pre)),y_pre,c='r',label='predict')  
4.  plt.plot(range(len(y_pre)),y_test,c='b',label='true')  
5.  plt.legend()  
6.  plt.show()  

最后用matplotlib.pyplot库画出图。结果如下,红色是学习预测值,蓝色的是真实值,可以看出学习预测值与真实值结合的很好,那个红色的峰值是全部变量叠加的效应。

至此通过表1和表2,即风险任务下发和评估税款这两者的之间关系的机器学习代码结束了。由于机器学习动辄数万条数据,而本文受数据所限一共才908条,所以此图形难免随着将来的数据增加而产生变化。此图并非最终模型。
机器学习关注的是计算机程序如何随着经验积累自动提高性能。最大的吸引力在于,不需要写任何与问题相关的特定代码,泛型算法就能获知数据的规律。所以笔者也建议税务系统通过TensorFlow建立属于自己的GPU神经网络,将企业资产负债表和申报表随着每月申报纳入到数据模型中,利用深度学习方法,将模型建立的完善、准确,驶上人工智能的快车道。

本着保密工作要求,文章所采用的样本,在数据清洗之初就作了随机数加法(从1到2),通过与原样对比,与所得结果无碍,也进一步证实了机器学习运用于财务报表的可行性。本文代码运行在win10 64位操作系统 以及 Python3.6 , Anaconda 5.0.1 ,sklearn 0.18.01 环境下,笔者的email: batz@qq.com 欢迎来邮指正。

https://www.python.org/
https://anaconda.org/
http://scikit-learn.org/stable/