1. 程式人生 > >在分類過程中對連續資料的類劃分

在分類過程中對連續資料的類劃分

分類中對連續資料的類劃分:

在 C4.5 演算法中採用二分法對連續值進行處理。
Markdown Code

對於連續的屬性 XX 假設共出現了 n 個不同的取值,將這些取值從小到大排序{x1,x2,x3,…,xn}{x1,x2,x3,…,xn},其中找一點作為劃分點 t ,則將資料劃分為兩類,大於 t 的為一類,小於 t 的為另一類。而 t 的取值通常為相鄰兩點的平均數

t=xi+xi+12t=xi+xi+12。

則在 n 個連續值之中,可以作為劃分點的 t 有 n-1 個。通過遍歷可以像離散型一樣來考察這些劃分點。

Gain(D,X)=Ent(D)−||D

def get_splitpoint(data, base_ent, feature):
    """
    引數:
    data -- 資料集
    base_ent -- 根節點的資訊熵
    feature -- 需要劃分的連續特徵

    返回:
    final_t -- 連續值最優劃分點
    """
    continues_value = data[feature].sort_values().astype(np.float64)  # 將連續值進行排序並轉化為浮點型別
    continues_value = [i for i in continues_value]  # 不保留原來的索引
t_set = [] t_ent = {} for i in range(len(continues_value)-1): # 得到劃分點 t 的集合 temp_t = (continues_value[i]+continues_value[i+1])/2 t_set.append(temp_t) for each_t in t_set: # 計算最優劃分點 temp1_data = data[data[feature].astype(np.float64) > each_t] # 將大於劃分點的分為一類
temp2_data = data[data[feature].astype(np.float64) < each_t] # 將小於劃分點的分為一類 weight1 = len(temp1_data)/len(data) weight2 = len(temp2_data)/len(data) temp_ent = base_ent-weight1 * \ get_Ent(temp1_data)-weight2*get_Ent(temp2_data) # 計算每個劃分點的資訊增益 t_ent[each_t] = temp_ent print("t_ent:", t_ent) final_t = max(t_ent, key=t_ent.get) return final_t final_t=get_splitpoint(data,base_ent,'height') #得到final_t後,對資料進行預處理: def choice_1(x, t): if x > t: return ">{}".format(t) else: return "<{}".format(t) deal_data = data.copy() # 使用lambda和map函式將 height 按照final_t劃分為兩個類別 deal_data["height"] = pd.Series( map(lambda x: choice_1(int(x), final_t), deal_data["height"])) deal_data