評分是對個人或機構(gòu)的相關信息進行分析之后的一種數(shù)值表達,表示此人或此機構(gòu)由于信用活動的拒付行為所造成損失風險的可能性,評分通常用于對個人或機構(gòu)的風險管理與評估。
URule Pro中的評分卡就是用來計算評分的,它使用二維表形式展示目標對象的各個屬性,針對不同屬性設置不同區(qū)段的條件,每個區(qū)段條件對應不同的分值,運行時引擎會根據(jù)定義的區(qū)段條件自動計算目標對象的評分。一個定義好的評分卡效果如下圖所示:
打開URule Pro控制臺,在項目的“評分卡”節(jié)點上右鍵,從彈出菜單中選擇“添加評分卡”項,添加一個新的評分卡文件,如下圖所示:
在評分卡編輯器中,最上部是工具欄,通過這個工具欄導入需要的庫文件,這一點與其它的規(guī)則編輯器基本一致;工具欄下面評分卡屬性部分;接下來是評分卡配置的表格;最后是評分卡的得分計算方式及分值最終賦給哪個對象。
評分卡屬性有三塊,第一塊是配置當前評分卡表格是否支持權重(默認是不支持);第二塊是給當前評分卡命名;第三塊是具體屬性項目,與決策樹、決策表一樣,具體屬性項有四個,含義與決策樹、決策表完全相同。
與規(guī)則集、決策表一樣,評分卡定義時同樣需要導入相關的庫文件,在評分卡配置表格中,屬性列對應的目標對象就要求我們選擇一個變量對象,然后才可以通過工具欄上通過“添加屬性行”按鈕添加的屬性行定義具體的屬性。為演示這一操作,我們導入之前定義的包含“會員”變量庫文件,導入后就可以為評分卡第一列屬性列選擇目標對象了,如下圖所示:
這里我們選擇“會員”,接下來點擊工具欄上“添加屬性行”按鈕添加的屬性行,在屬性行的第一列中,我們可以點擊選擇具體的屬性,可以看到這里的屬性菜單內(nèi)容來自屬性列頭中選擇的目標對象,如果我們更改了目標對象,那么每個屬性行中屬性菜單內(nèi)容也會做相應的變化,如下圖所示:
在每個屬性行中,除了可以選擇目標屬性外,還可以在單元格里點擊右鍵,在彈出的菜單里選擇“添加條件行”項,為當前屬性拆分出更多的條件行,如下圖所示:
在條件列中,每個單元格都可以在其中點擊右鍵,通過彈出的右鍵菜單配置具體的單元格條件,可以看到其條件配置窗口與決策表中條件配置窗口完全相同,如下圖:
依次配置好各個條件行單元格,效果如下圖:
在URule Pro當中,評分卡還允許添加自定義列,通過點擊工具欄上的“添加自定義列”就可以為當前評分卡添加一個自定義列,自定義列中每個單元格都可以進行值定義,在運行時,引擎會自動計算這些單元格的值。一般情況下,添加自定義列的作用有兩種:一種是對當前行進行備注,起到一個注釋的作用;還有一種就是在“得分計算方式”中選擇“自定義”時,在自定義類中通過代碼可以獲取到每行的自定義列信息,從而做進一步的加工處理。
到這里,一個標準的評分卡表格就配置完了,接下來看看評分卡的得分計算方式,在URule Pro當中,對于得分計算方式提供了三種類型,如下圖:
第一種也就是默認的是“求和”,所謂求和就是對在運行時所有滿足條件的條件行對應的分值列的值內(nèi)容進行累加求和;第二種類型是“加權求和”,如果選擇加權求和,那么需要我們將評分卡表格上部的“權重”屬性設置為“支持”,這樣可以看到所有的屬性行中多出一個名為權重的編輯框,我們在這個編輯框中輸入具體的權重值,如下圖:
一般情況下,每個屬性單元格是的權重屬性值是一個小數(shù),所有的權重值加起應該是1。
這樣在將得分計算方式改為“加權求和”后,引擎將在運行時取到每個滿足條件的條件行的分值,將這個分值與當前行對應的權重值做乘法計算,最后將所有乘法計算后的結(jié)果相加作為當前評分卡的最終得分。
得分計算的最后一種方式是“自定義”,一旦選擇這種方式,那么我們需要指定自定義計算得分的Bean的ID,如下圖:
這里的Bean要求實現(xiàn)URule Pro中提供的com.bstek.urule.model.scorecard.runtime.ScoringStrategy接口,其源碼如下:
package com.bstek.urule.model.scorecard.runtime;
import com.bstek.urule.runtime.rete.Context;
/**
* @author Jacky.gao
*/
public interface ScoringStrategy {
/**
* 計算得分方法
* @param scorecard 當前評分卡對象
* @param context 運行時上下文對象
* @return 返回最終的得分值
*/
Object calculate(Scorecard scorecard,Context context);
}
其中用到的Scorecard源碼如下:
package com.bstek.urule.model.scorecard.runtime;
import java.util.List;
/**
* @author Jacky.gao
*/
public interface Scorecard {
/**
* @return 評分卡名稱
*/
String getName();
/**
* @return 評分卡表格的所有的行信息
*/
List<RowItem> getRowItems();
}
將實現(xiàn)了ScoringStrategy接口的類配置到spring上下文中,使其成為一個標準的spring bean,將bean的ID輸入到上面的自定義Bean的ID的編輯框中即可。下面是一個實現(xiàn)了ScoringStrategy接口的類示例源碼:
package com.bstek.urule;
import java.math.BigDecimal;
import com.bstek.urule.model.scorecard.runtime.CellItem;
import com.bstek.urule.model.scorecard.runtime.RowItem;
import com.bstek.urule.model.scorecard.runtime.Scorecard;
import com.bstek.urule.model.scorecard.runtime.ScoringStrategy;
import com.bstek.urule.runtime.rete.Context;
/**
* @author Jacky.gao
*/
public class TestScoringStrategy implements ScoringStrategy {
@Override
public Object calculate(Scorecard scorecard, Context context) {
BigDecimal result=new BigDecimal(120.12);
System.out.println("評分卡名:"+scorecard.getName());
for(RowItem row:scorecard.getRowItems()){
result=result.multiply(Utils.toBigDecimal(row.getScore()));
for(CellItem cellItem:row.getCellItems()){
System.out.println("自定義列"+cellItem.getColName()+":"+cellItem.getValue());
}
}
return result;
}
}
配置完得分計算方式后,我們還需要配置計算好的得分該賦給誰,這里默認是不賦給任何對象,這樣計算后分值只會存留在引擎中,會在控制臺以一條警告信息的形式打印出來。
一般情況下,計算好的得分, 我們需要將它放到一個變量或參數(shù)當中,我們在代碼中就可以得到這個評分值,從而做進一步處理。點擊“不賦值”,在彈出的菜單中選擇要賦值的目標對象,如下圖:
可以看到,這里能賦值的對象只有變量和參數(shù),通常情況下,我們會選擇將評分值賦給一個參數(shù),從而在業(yè)務代碼中從參數(shù)中取到這個分值再做其它處理。當然如果選擇變量那么就需要導入相應的變量庫文件,選擇參數(shù)就要導入相應的參數(shù)庫文件。
到這里,一個簡單的評分卡就定義完成了,有興趣的可以在當前項目里創(chuàng)建一個知識包,將這個評分卡放到知識包里,然后對其進行仿真測試,看看在給出一定條件后規(guī)則的評分情況是怎么樣,這里就不再贅述。
這里的介紹的評分卡是URule Pro中提供的一種相對簡單的評分卡,它只能對一個對象的某些屬性進行評估計算,如果我們需要對多個對象的屬性進行條件疊加來計算得分的話,那么這里的評分卡功能就滿足不了了,所以URule Pro還提供了一種復雜評分卡工具,功能類似于我們的決策表,用于實現(xiàn)多對象多條件累加評分計算,后一章節(jié)中就將對這種復雜評分卡工具進行介紹。
從2.2.1版本開始,URule Pro中的評分卡支持從Excel中導入,我們只需要按要求在Excel中定義好具體的評分卡內(nèi)容,然后就可以直接將這個Excel導入到一個復雜評分卡當中。下圖是一個定義好的可以導入到復雜評分卡的Excel截圖, 點擊此處下載該Excel:
可以看到,在這個Excel當中,第一行用于定義對象及對象下用于定義條件的屬性,比如上圖中的“客戶”以及其下的“年齡”、“性別”、“婚否”,這個對象及其下屬性要求我們必須預先在當前項目的某一個變量庫文件里定義好, 否則導入該Excel時會產(chǎn)生錯誤;第二列用于定義具體屬性對應的條件,其列頭為“條件”是固定不變的,這樣導入引擎就可以將該列作為條件列處理;最后一列的列頭名為“分值”,這里的“分值”也是固定的,不能更改,這樣導入的時候引擎就會認為該列是用于評分的列。
更多建議: