1.企业欺诈识别
(本节内容的数据见电脑F:/python数据/audit_risk 或腾讯微云文件”python数据\audit_risk “)
最后一列是预测列,预测是否存在风险;前面的列是特征列。
我们要把特征列和预测列单独分开。
第一步先阅读数据
第二步:数据预处理
我们要把非数值型数据处理为数值型
第三步:模型划分(把数据划分为特征列和预测列,最后一列是预测列,预测是否存在风险;前面的列是特征列。)
import pandas as pd
frame=pd.read_csv('F:/python数据/audit_risk.csv',header=0)
y=frame[frame.columns[len(frame.columns)-1]] #Risk是预测列,我们要单独提出来
#frame.columns[len(frame.columns)-1]得到的就是最后一列的列名称“Risk”
frame.drop(frame.columns[len(frame.columns)-1],axis=1,inplace=True) #Risk是预测列,我们要删除预测列“Risk”
X=frame
print(X)
'''我们之所以没有用frame['Risk']直接定位最后一列,是因为我们有时候见到的数据是没有列名的'''
第四步:数据训练
import pandas as pd
from sklearn.model_selection import train_test_split
frame=pd.read_csv('F:/python数据/audit_risk.csv',header=0)
#frame.columns[len(frame.columns)-1]就是"Risk"
y=frame[frame.columns[len(frame.columns)-1]] #Risk是预测列,我们要单独提出来
frame.drop(frame.columns[len(frame.columns)-1],axis=1,inplace=True) #Risk是预测列,我们要删除预测列“Risk”
X=frame
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.1)
#依次是特征训练集,特征测试集,预测训练集,预测测试机
#test_size=0.1就是说训练集和测试集比例为9:1
第五步:效果评估
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('F:/python数据/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,test_size=0.1)
estimator=KNeighborsClassifier()
estimator.fit(X_train,y_train)
y_predicted=estimator.predict(X_test)
print('准确度为:{:.1f}%'.format(np.mean(y_test==y_predicted)*100))
2.企业欺诈识别的完善
(本节内容的数据见电脑F:/python数据/audit_risk 或腾讯微云文件”python数据\audit_risk “)
1.数据预处理
①非数值的处理
import pandas as pd
import numpy as np
frame=pd.read_csv('F:/python数据/audit_risk.csv')
results=frame.applymap(np.isreal)
#applymap(函数a)可以将DtaFrame中所有元素都应用一下“函数a”的运算,np.isreal判断是不是数字
#只要某一列中存在一个非数字型数据,那么这一列就全是False
print(results)
import pandas as pd
import numpy as np
frame=pd.read_csv('F:/python数据/audit_risk.csv')
results=frame.applymap(np.isreal).all() #加上.all()就可以只显示我们需要的信息
print(results)
import pandas as pd
import numpy as np
frame=pd.read_csv('F:/python数据/audit_risk.csv')
results=frame.applymap(np.isreal).all()
print(results[(results==False)]) #只显示有问题的列
import pandas as pd
import numpy as np
frame=pd.read_csv('F:/python数据/audit_risk.csv')
frame['LOCATION_ID']=pd.to_numeric(frame['LOCATION_ID'],errors='coerce')
#将我们检索出来的异常列全部用数值填充那些异常数值,pd.to_numeric就是转为数值的意思,errors='coerce'就是用空值填充非数字的数据
results=frame.applymap(np.isreal).all() #再次检索看看还有没有非数字列
print(results)
②空值的处理
import pandas as pd
import numpy as np
frame=pd.read_csv('F:/python数据/audit_risk.csv')
frame['LOCATION_ID']=pd.to_numeric(frame['LOCATION_ID'],errors='coerce')
#将我们检索出来的异常列全部用数值填充那些异常数值,errors='coerce'就是用空值填充异常数据
results=frame.isnull() #返回一个和原始DataFrame一样大小的矩阵,其中True表示该数字为空值
print(results)
import pandas as pd
import numpy as np
frame=pd.read_csv('F:/python数据/audit_risk.csv')
frame['LOCATION_ID']=pd.to_numeric(frame['LOCATION_ID'],errors='coerce')
results=frame.isnull().any(0) #使用any(0)当这一列内在任何一个空值则这一列返回True
print(results)
import pandas as pd
import numpy as np
frame=pd.read_csv('F:/python数据/audit_risk.csv')
frame['LOCATION_ID']=pd.to_numeric(frame['LOCATION_ID'],errors='coerce')
results=frame.isnull().any(1) #使用any(1)当这一行内在任何一个空值则这一行返回True
print(results[results==True])
import pandas as pd
import numpy as np
frame=pd.read_csv('F:/python数据/audit_risk.csv')
frame['LOCATION_ID']=pd.to_numeric(frame['LOCATION_ID'],errors='coerce')
frame=frame.fillna(0) #使用0来填充对应的空值
results=frame.isnull().any(0)
print(results)
import pandas as pd
from sklearn.impute import SimpleImputer
frame=pd.read_csv('F:/python数据/audit_risk.csv')
frame['LOCATION_ID']=pd.to_numeric(frame['LOCATION_ID'],errors='coerce')
imp=SimpleImputer(strategy='mean') #利用空值所在列的数据平均值来填充空值
newframe=imp.fit_transform(frame)
print(newframe)
import pandas as pd
from sklearn.impute import SimpleImputer
frame=pd.read_csv('F:/python数据/audit_risk.csv')
print(frame) #数据是DataFrame类型
frame['LOCATION_ID']=pd.to_numeric(frame['LOCATION_ID'],errors='coerce')
print(frame) #数据还是DataFrame类型
imp=SimpleImputer(strategy='mean') #利用空值所在列的数据平均值来填充空值
newframe=imp.fit_transform(frame)
print(newframe) #经过这一步处理,数据变成了numpy类型
'''我们有一步是划分特征数据与预测数据
y=frame[frame.columns[len(frame.columns)-1]]
frame.drop(frame.columns[len(frame.columns)-1],axis=1,inplace=True)
这一步必须趁着还是DataFrame类型时处理'''
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier #使用最近邻模型
from sklearn.impute import SimpleImputer
import numpy as np
frame=pd.read_csv('F:/python数据/audit_risk.csv')
frame['LOCATION_ID']=pd.to_numeric(frame['LOCATION_ID'],errors='coerce') #把异常数值处理为空值
y=frame[frame.columns[len(frame.columns)-1]]
frame.drop(frame.columns[len(frame.columns)-1],axis=1,inplace=True)
imp=SimpleImputer(strategy='mean') #利用空值所在列的数据平均值来填充空值
newframe=imp.fit_transform(frame)
X=newframe
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.1)
estimator=KNeighborsClassifier()
estimator.fit(X_train,y_train)
y_predicted=estimator.predict(X_test)
print('准确度为:{:.1f}%'.format(np.mean(y_test==y_predicted)*100))
③数据规范化处理
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
import numpy as np
frame=pd.read_csv('F:/python数据/audit_risk.csv')
frame['LOCATION_ID']=pd.to_numeric(frame['LOCATION_ID'],errors='coerce') #把异常数值处理为空值
frame=frame.fillna(0) #用0来填充空值
y=frame[frame.columns[len(frame.columns)-1]]
frame.drop(frame.columns[len(frame.columns)-1],axis=1,inplace=True)
X=frame
X=StandardScaler().fit_transform(X) #这一步就是数据规范化处理,用来处理那些“过激”的数据
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.1)
estimator=KNeighborsClassifier()
estimator.fit(X_train,y_train)
y_predicted=estimator.predict(X_test)
print('准确度为:{:.1f}%'.format(np.mean(y_test==y_predicted)*100))
2.交叉验证
①将训练集和测试集交换一下
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('F:/python数据/audit_risk.csv')
frame['LOCATION_ID']=pd.to_numeric(frame['LOCATION_ID'],errors='coerce') #把异常数值处理为空值
frame=frame.fillna(0) #用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,test_size=0.1)
estimator=KNeighborsClassifier()
estimator.fit(X_test,y_test) #交换了训练集和测试集来交叉验证
y_predicted=estimator.predict(X_train) #交换了训练集和测试集来交叉验证
print('准确度为:{:.1f}%'.format(np.mean(y_train==y_predicted)*100))
②用cross_val_score
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
import numpy as np
from sklearn.model_selection import cross_val_score
frame=pd.read_csv('F:/python数据/audit_risk.csv')
frame['LOCATION_ID']=pd.to_numeric(frame['LOCATION_ID'],errors='coerce') #把异常数值处理为空值
frame=frame.fillna(0) #用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,test_size=0.1)
estimator=KNeighborsClassifier()
scores=cross_val_score(estimator,X,y,scoring='accuracy',cv=10) #scoring='accuracy'评估指标是“精准度”,cv=10交叉分组的次数是10
print(np.mean(scores))