環境
python相關環境
- python 3.7
- graphviz
- sklearn
- pandas
- numpy
數據
- nsrxx
例:
(65353,8919,173,2016-04-15 00:00:00.0,2017-06-29 15:18:07.0,0)
- zzsfp
- zzsfp_humx
1.數據處理
將數據zzsfp和zzsfp_humx兩個數據合並為com
com = pd.merge(zzsfp, nsrxxtemp1, how="inner", on="那一列")
刪除部分列減少特征
com = df.drop(labels={'要刪除的列'}, axis=1)
# com只保留了
['數量', '單價', '金額', '稅額', '銷方代碼', '購方代碼', '價稅合計']
將內容類型轉換為int64
com['數量'] = pd.to_numeric(com['要轉換的列'], errors='coerce').fillna('如果某一格轉換失敗用什么填充').astype('要轉換成什么類型')
刪除中文字符、英文字符以及部分符號
# 通過正則表達式
# 所有中文
com = com.replace('^[\u4e00-\u9fa5]{0,}$', 0, regex=True)
# 所有英文
com = com.replace('^[A-Za-z]+$', 0, regex=True)
2.生成數據集
取com中的一萬條數據作為訓練集 hwmx
找出其中有問題的企業並設置與hwmx想對應的目標集
這里我是通過pandas隨機取出10000行保存到數據庫通過sql語句進行篩選的,sql語句沒有保留
查找到的有問題的企業
[50743, 142165, 71981, 283865, 109943, 114237, 212158, 216833, 159859, 212638, 52124, 6965]
生成目標集
result = []
def getResult(x):
if x in [50743, 142165, 71981, 283865, 109943, 114237, 212158, 216833, 159859, 212638, 52124, 6965]:
result.append(1)
else:
result.append(0)
hwmx['銷方代碼'].apply(getResult)
3.生成模型
# 轉為數組
com_numpy = com.drop(labels={'id'}, axis=1)
com_numpy = com_numpy.to_numpy()
arr = hwmx.to_numpy()
res = np.array(result)
# 將訓練集划分成訓練集和驗證集
Xtrain, Xtest, Ytrain, Ytest = train_test_split(arr, res, test_size=0.3) # 分訓練集、測試集 測試集占0.3
# DecisionTreeClassifier有多個參數可調,具體看官方文檔
clf = tree.DecisionTreeClassifier(criterion="entropy") # 載入決策樹分類模型
clf = clf.fit(Xtrain, Ytrain) # 決策樹擬合,得到模型
score = clf.score(Xtest, Ytest) # 返回預測的准確度
print("准確率:", score)
# 將得到的模型保存
with open("hwmx.dot", 'w') as f:
f = tree.export_graphviz(clf, out_file=f)
# 將得到的模型生成pdf
dot_data = tree.export_graphviz(clf, out_file=None)
graph = graphviz.Source(dot_data)
graph.render("hwmx")
模型可視化
4.模型調優
基本沒做
5.預測
# 預測
result = clf.predict(com_numpy)
temp = pd.DataFrame(result)
temp.to_csv(r'F:\測試數據源\temp\tempresult.csv', header=False)
# 獲取公司
res = pd.read_csv(r'F:\測試數據源\temp\tempresult.csv', header=None, names=['id', 'Y/N'])
com = com.drop(labels={'數量', '單價', '金額', '稅額', '購方代碼', '價稅合計'}, axis=1)
print(com.dtypes)
df = pd.merge(com, res, how="inner", on="id")
result = df[df['Y/N'] == 1]
# result是問題發票集,對企業id進行groupby分組獲得所有問題企業id
result = result.groupby('銷方代碼')
print(result.groups.keys())
tempresult.csv內容中並沒有公司id只有與com相對應的編號和預測返回的結果,例:
0 1
1 1
2 1
所以和com表拼接在一起並刪除多余列獲得最終的問題企業結果
"xf_id"
169749
147907
162258
27335
167426
110263
310054
134787
22901
216833
19765