王 茵,郭紅鈺
(華北計算技術(shù)研究所系統(tǒng)八部,北京 100083)
自2003年至今,全國各個省市都相繼建立了自己的社區(qū)矯正體系。隨著我國相關(guān)政策的不斷推進,社區(qū)矯正體系中的社區(qū)矯正人員越來越多,目前其數(shù)量已經(jīng)達到百萬,涉及的案件情況也越來越復雜。刑法改革在給予罪犯在相對寬松的環(huán)境下重新改過機會的同時[1],也不可避免地給社會帶來了更大風險,尤其是對服刑人員所在的社區(qū)居民。
在當前時代背景下,社區(qū)矯正工作面臨著眾多現(xiàn)實挑戰(zhàn),其中如何利用現(xiàn)有的相關(guān)技術(shù)來對社區(qū)矯正人員的危險性進行評估,從而為社區(qū)矯正人員監(jiān)管提供有效指導是最具有現(xiàn)實意義的一個方面[2]。
目前國內(nèi)外針對罪犯的危險性評估有很多理論研究以及實際案例,例如在美國新澤西州使用的罪犯智能系統(tǒng)使該地的再犯罪率下降了近30%[3];理論研究則主要是集中在機器學習和數(shù)據(jù)挖掘2個領(lǐng)域的相關(guān)算法,例如聚類方法[4]、決策樹分析[5]、關(guān)聯(lián)規(guī)則[6]等。但這些研究大多停留在理論層面,沒有在實際的業(yè)務數(shù)據(jù)中實驗,因此在對各類算法進行選取時并不能考慮全面,另外,在社區(qū)矯正的實際工作中,非必填的數(shù)據(jù)項大多會出現(xiàn)數(shù)據(jù)缺失,而這些缺失的數(shù)據(jù)項可能會對后續(xù)預測影響很大。
針對以上問題,本文將結(jié)合某市局的社區(qū)矯正人員數(shù)據(jù),使用分類回歸樹(Classification and Regression Trees,CART)算法來建立社區(qū)矯正人員危險性的評估模型并計算準確率,并對數(shù)據(jù)缺失問題提出解決辦法。
CART算法是決策樹算法的一種,既可以用于分類也可以用于回歸。與經(jīng)典的ID3決策樹生成算法不同,該算法應用二分遞歸把當前數(shù)據(jù)集分割為2個子集[7],令生成的每一個非葉子節(jié)點都有2個分支,因此最終生成的決策樹應該是二叉樹,這也使每一步進行決策只有“是”與“否”2個選擇。如果存在某個特征的取值有多個,應將數(shù)據(jù)分為2個部分,下面詳細介紹基本原理。
1.1.1 遞歸劃分樣本進行建樹
設(shè)x1,x2,…,xn代表樣本集中某個樣本的n種屬性,該樣本的所屬類別用y表示。
進行劃分時,首先在上述屬性中選一個自變量xi,再選取xi的一個值vi,vi把這個n維空間劃分成2個部分:一部分的點均有xi≤vi,另一部分的點均有xi>vi。對于離散變量,其屬性值只有2個取值,等于或不等于該值;然后進行遞歸處理,將得到的2部分按前一個步驟重新選取屬性繼續(xù)劃分,直到將數(shù)據(jù)集劃分完。
與基于信息增益作為節(jié)點劃分標準的ID3算法不同,CART算法的劃分基于“基尼指數(shù)”(Gini Index),如果假設(shè)一個數(shù)據(jù)集D,它的純度可用基尼指數(shù)度量為:
其中,pi表示屬于i類別的概率。直觀來說,Gini(D)反映了從數(shù)據(jù)集D中隨機抽取2個樣本,其類別標記不一致的概率。因此,Gini(D)越小,數(shù)據(jù)集D的純度越高,當Gini(D)=0時,所有樣本屬于同類。所以,在候選屬性集合中選擇屬性作為主節(jié)點時,應當選擇使劃分后Gini指數(shù)最小的屬性作為最優(yōu)劃分屬性。
下面以少量服刑人員數(shù)據(jù)為例說明上述劃分過程。表1數(shù)據(jù)是從某市法局社區(qū)矯正人員數(shù)據(jù)中選取的部分特征值,其中數(shù)據(jù)屬性有“性別”、“案件類別”、“年齡”,其中“性別”和“案件類別”是離散的取值,“年齡”是連續(xù)的取值,“是否再次犯罪”是分類的結(jié)果。
表1 服刑人員部分信息表
按照性別屬性劃分后的Gini指數(shù)計算見表2。
表2 性別劃分結(jié)果
Gini(t1)=1-(3/3)2-(0/3)2=0
Gini(t2)=1-(4/7)2-(3/7)2=0.4849
Gini=0.3×0+0.7×0.4898=0.343
由于“案件類別”有3種取值,按照每種屬性分裂后,Gini指數(shù)的計算結(jié)果見表3~表5。
表3 類別劃分結(jié)果1
Gini(t1)=1-(6/8)2-(2/8)2=0.375
Gini(t2)=1-(1/2)2-(1/2)2=0.5
Gini=8/10×0.375+2/10×0.5=0.4
表4 類別劃分結(jié)果2
Gini(t1)=1-(3/6)2-(3/6)2=0.5
Gini(t2)=1-(4/4)2-(0/4)2=0
Gini=6/10×0.5+2/10×0.5=0.3
表5 類別劃分結(jié)果3
Gini(t1)=1-(5/6)2-(1/6)2=0.2778
Gini(t2)=1-(2/4)2-(2/4)2=0.5
Gini=6/10×0.2778+4/10×0.5=0.366
根據(jù)上述計算結(jié)果,由“盜竊或搶劫”和“販毒”分裂后得到的Gini指數(shù)最小。由于年齡取值是連續(xù)的,所以采用分裂點進行分裂,結(jié)果見表6。
表6 年齡劃分結(jié)果
根據(jù)表6的計算結(jié)果,由44.5作為分裂點后得到的Gini指數(shù)最小。
1.1.2 用驗證數(shù)據(jù)進行剪枝
在CART建樹過程中,可能存在過擬合,得到的決策樹會降低分類的準確性,此時需要進行剪枝。在決策樹中,常用的剪枝策略有預剪枝和后剪枝2種。CART算法使用的是后剪枝[8](代價復雜性剪枝法),考察生成的決策樹的各個節(jié)點,觀察如果將其替換為葉節(jié)點之后整體的準確率是否會提高,如果是則進行替換,反之不替換[9]。
一般來說,將機器學習算法應用到具體的生產(chǎn)場景中,通常需要遵循以下步驟:
1)收集數(shù)據(jù)??梢允褂枚喾N方法來收集數(shù)據(jù),例如:利用網(wǎng)絡(luò)爬蟲從網(wǎng)站上抽取數(shù)據(jù)、API中反饋數(shù)據(jù)、從設(shè)備中得到實時測量數(shù)據(jù)。本文直接從某市區(qū)得到服刑人員的基本數(shù)據(jù)(隱藏敏感信息)。
2)準備輸入數(shù)據(jù)。得到的數(shù)據(jù)必須確保其數(shù)據(jù)格式符合要求,從而融合算法,方便匹配操作。
3)分析輸入數(shù)據(jù)。人工分析數(shù)據(jù),觀察是否存在異常值或空值等。這一步的主要作用是確保數(shù)據(jù)集中沒有垃圾數(shù)據(jù),本文中使用實際數(shù)據(jù),可直接跳過這一步。
4)訓練算法。將前文中得到的格式化數(shù)據(jù)輸入到模型中抽取得到知識或信息,并存儲為計算機可以處理的格式,方便后續(xù)步驟使用。
5)測試算法。為了評估算法的效果,對算法工作效率進行測試。如果測試結(jié)果沒有達到預期的目標,則返回修改并重新測試。
6)使用算法。將該算法用于執(zhí)行實際學習任務,在實際環(huán)境中對前面的步驟進行檢驗,觀察是否可以正常工作。
利用社區(qū)矯正人員的基礎(chǔ)數(shù)據(jù)得到其危險性評估結(jié)果,是社區(qū)矯正工作中最期望解決的問題,它能夠有效預防和減少服刑人員對社會造成二次危害。本章利用某市社區(qū)矯正人員的基礎(chǔ)數(shù)據(jù),基于CART算法建立危險性評估模型。
本文使用的數(shù)據(jù)集是某市社區(qū)矯正人員的數(shù)據(jù)(不包含敏感信息),包括特征集合和分類標簽2部分,數(shù)據(jù)量為3500條。
2.1.1 特征集合
特征集合中包含服刑人員基礎(chǔ)信息中的18項非空數(shù)據(jù)項,見表7。
表7 數(shù)據(jù)項
2.1.2 分類標簽
分類的依據(jù)是服刑人員信息表中的“危險性評估”一項,有2種取值,見表8。
表8 類別項
從某市司法局得到的社區(qū)矯正人員初始數(shù)據(jù)共4500條,去除臟數(shù)據(jù)、無效數(shù)據(jù)、測試數(shù)據(jù)等,得到的最終有效數(shù)據(jù)為3300條。
根據(jù)2.1節(jié)中的數(shù)據(jù)集,進行CART算法實現(xiàn)和評估模型的建立。樣本集中有18個特征屬性和一個結(jié)果屬性。首先使用sklearn[10]來調(diào)用CART算法對數(shù)據(jù)集建模:
Step1加載數(shù)據(jù)。
CART建模過程1
data=pd.read_csv(′data.txt′, header=None)
x=np.array(data.loc[:,1:18],dtype=np.int64)
y=np.array(data.loc[:,0],dtype=np.int64)
#訓練數(shù)據(jù)占比為0.6,測試數(shù)據(jù)占比為0.4
X_train,X_test,Y_train,Y_test=train_test_split(x,y,test_size=0.4)
Step2訓練階段。
CART建模過程2
startTime=time.time()
clf=tree.DecisionTreeClassifier(random_state=42)
clf=clf.fit(X_train,Y_train)
print(′Training Completed.Took %f s.′%(time.time()-startTime))
Step3測試階段。
CART建模過程3
Y_predict=clf.predict(X_test)
matchCount=0
for i in range(len(Y_predict)):
if Y_predict[i]==Y_test[i]:
matchCount+=1
accuracy=float(float(matchCount)/float(len(Y_predict)))
模型建立好后,調(diào)用GraphViz實現(xiàn)決策樹可視化。
決策可視化過程:
#18個特征值對應的節(jié)點名稱
feature_name=[′JZLB′,′XB′,′SFYJSB′,′SFYCRB′,′WHCD′,′HYZK′,′PQZY′,′SFSWRY′,′SFYQK′,′SFLF′,′FZLX′,′FJX′,′SFWD′,′SFWS′,′SFYSS′,′SFBXGJZL′,′SFSYDZDWGL′,′SFTG′])
#分類結(jié)果(2類)
target_name=[′Class1′,′Class2′]
dot_data=StringIO()
tree.export_graphviz(clf,out_file=dot_data,feature_names=feature_name,class_names=target_name,filled=True,rounded=True,special_characters=True)
graph=pydotplus.graph_from_dot_data(dot_data.getvalue())
圖1 實驗準確率(訓練數(shù)據(jù)和測試數(shù)據(jù)占比分別為0.6和0.4)
在訓練數(shù)據(jù)和測試數(shù)據(jù)占比分別為0.6和0.4時,實驗的準確率變化情況見圖1,模型的準確率基本維持在85%~98%,訓練時間在10 ms內(nèi)。
不斷調(diào)整訓練數(shù)據(jù)和和測試數(shù)據(jù)占比,每次調(diào)整進行10次實驗,以平均值作為該占比下的準確率,實驗結(jié)果見圖2,訓練時間在10 ms內(nèi)。
圖2 不同參數(shù)平均準確率
由以上實驗結(jié)果可知,當訓練數(shù)據(jù)和測試數(shù)據(jù)占比分別為0.6和0.4時,模型的準確率最高,得到剪枝以后的決策樹可視化結(jié)果見圖3,決策樹中包含分支的特征以及對應數(shù)據(jù)子集的基尼系數(shù)和分類結(jié)果,結(jié)果表明,剪枝后只需6個特征值(PQZY、XB、HYZK、FZLX、WHCD、SFYJSB)即可判斷屬于哪一種類別。
本文中使用的數(shù)據(jù)集均為非空數(shù)據(jù)項,但是在社區(qū)矯正的實際工作中,由于各種原因,并不是所有數(shù)據(jù)項都為非空,此時若想利用某些算法來預估社區(qū)矯正人員的危險性就需要對數(shù)據(jù)集進行相關(guān)處理,目前對于數(shù)據(jù)缺失的處理辦法有很多[11],主要分為3大類:刪除、補全和忽略。
在實際使用的數(shù)據(jù)庫中,數(shù)據(jù)缺失是不可避免且經(jīng)常發(fā)生的,造成這種現(xiàn)象的原因主要有以下幾種:
1)有些信息暫時無法獲取。例如在記錄病人臨床檢驗結(jié)果的數(shù)據(jù)庫中,由于所有檢查結(jié)果不是都能在給定時間內(nèi)給出,所以會導致一部分屬性值缺失。
2)有些信息是被遺漏的。例如填寫數(shù)據(jù)時由于人為原因造成的漏填或錯填,或是設(shè)備故障導致的數(shù)據(jù)采集異常等。
3)有些對象的某個或某些屬性不可用。例如未婚者配偶的姓名或一個兒童的固定收入情況等。
4)獲取這些信息的代價太大。
5)數(shù)據(jù)在獲取之前就需要快速決策,對性能有較高的實時要求。
圖3 剪枝后的決策樹
1)刪除元組。
刪除含有遺漏信息的元組(對象),從而得到完備的信息表。該方法適用于元組中有多個缺失屬性或有缺失屬性的數(shù)據(jù)占所有數(shù)據(jù)比例很小的情況。此方法簡單易行[12],但也有一定的局限性,由于該方法會丟失一些歷史信息,造成資源的浪費,從而失去隱藏在這些數(shù)據(jù)中的信息,所以如果缺失數(shù)據(jù)占比較大時,使用這種方法可能會得到錯誤的結(jié)論。
2)數(shù)據(jù)補齊。
使用某個值填充缺失值,從而得到完整信息表。通常情況下使用平均值、中值、通過某種算法計算出可能值填充。
3)不處理。
直接使用包含控制的數(shù)據(jù)集進行學習或數(shù)據(jù)挖掘,通常包括貝葉斯方法和人工神經(jīng)網(wǎng)絡(luò)等。其中,貝葉斯方法[13]會建立貝葉斯網(wǎng)絡(luò),用來表示各個變量之間的連接關(guān)系,從而發(fā)現(xiàn)數(shù)據(jù)之間潛在的關(guān)系。在貝葉斯網(wǎng)絡(luò)中[14],變量用節(jié)點表示,變量之間的依賴關(guān)系用有向邊表示。貝葉斯方法適合對變量之間的依賴關(guān)系比較清楚的情況,這種方法的復雜度較高,相關(guān)參數(shù)也多,如果直接從數(shù)據(jù)中學習貝葉斯網(wǎng)結(jié)構(gòu),會影響預測的精度。
在建立評估模型時使用了18個社區(qū)矯正人員的特征,且都是非空數(shù)據(jù),現(xiàn)考慮增加表屬性值,見表9。
表9 增加的屬性
下面借助pandas中的info()觀察具體特征的情況,得到的特征信息見表10。
查看數(shù)據(jù)集中的特征情況:
import pandas as pd
#讀取user_info_train.csv表
fxry_info=pd.read_csv(′fxry_info_train.csv′)
#info()查看每個特征的數(shù)據(jù)量情況
print fxry_info.info()
表10 特征信息
1)缺失值較多的特征處理。
一般如果某特征的缺失量過大,會直接將該特征舍棄掉,否則會帶入較大誤差,對結(jié)果造成不良影響。在表10中“GZQX”特征值由于缺失過多,為避免引入過多的錯誤信息,可以直接舍棄該特征值。
2)缺失值較少的特征處理。
當特征缺失值在15%以內(nèi),則認為是是缺失值較少,例如表10中的“HXKYQX”特征。缺失值較少的特征處理方法:1)將NULL值直接作為一個特征;2)用均值填充,如果是訓練集中有缺失值,而測試集中沒有缺失值,此時最合適的處理方法是對缺失值取條件均值或條件中值;3)用上下數(shù)據(jù)進行填充;4)插值法填充,插值法就是通過兩點估計中間點;5)用算法擬合進行填充,例如可用隨機森林算法,利用數(shù)據(jù)表中某些沒有缺失的特征屬性來預測某特征屬性的缺失值。
針對如何利用機器學習算法對社區(qū)矯正人員危險性進行評估一直以來都停留在理論研究階段。由于社區(qū)矯正工作的特殊性,服刑人員的數(shù)據(jù)存在很多缺失情況,這對評估模型的建立起到很大的阻礙,現(xiàn)階段并沒有找到可實踐的方法。為了解決上述問題,本文首先基于CART算法利用某市的3000多條數(shù)據(jù)建立了針對社區(qū)矯正人員數(shù)據(jù)集的危險性評估模型,經(jīng)過多次實驗,準確率在85%~90%之間。此外,針對社區(qū)矯正人員信息的數(shù)據(jù)缺失情況,本文結(jié)合目前可用的數(shù)據(jù)缺失處理方法進行分析并提出可行的處理方法。