【代碼分享】特徵工程中 分類變量 映射成 數字

在特徵處理中,有一些特徵裏面的值是一些可分類的字符串,舉個例子:

姓名 學歷 收入
小張 高中 4000-5000元
小王 本科 6000-7000元
小李 碩士 8000-9000元
小趙 本科 6000-7000元


學歷可分爲:高中、大專、本科、碩士等。收入可分爲:4000-5000元、6000-7000元等。這些分類有時爲中文,容易產生亂碼。有些是英文字符,可能比較長,查看不方便。如果樣本量非常多的話,保存下來的文件較大。

所以可以將 高中→1,大專→2,本科→3 ···;4000-5000元→1、6000-7000元→2 ···

這些特徵工程處理上,可以對這種可分類的字符串進行替換,映射成一組數字去替換。但需要注意的是,雖然用數字替換,但數字僅僅是各分類變量的一個替換,並沒有真正意義的數字含義,所以不能比較大小,也不能當成連續字符處理。

下面給出了批量替換的代碼。

首先是將字符串映射成數字,然後逐列操作。

## 分類變量→數字的映射
def str2num(col_name):
    value_dict = {}
    unique_str = np.unique(col_name)
    for num,value in enumerate(unique_str,start=1):
        value_dict[value] = num
    return value_dict

## 尋找字符串類型的特徵,並進行映射
def use_dict(df):
    str2num_dict = {}
    obj_feature = df.dtypes[df.dtypes=="object"].index
    for obj in obj_feature:
        str2num_dict[obj] = str2num(df[obj].astype("str"))
    return str2num_dict

爲了以後可以直接應用,需要將字典進行保存,保存成pickle文件。

import pickle

## run data
str2num_dict = use_dict(data)
## save dict
with open("str2num_dict.plk",'wb') as f:
    pickle.dump(str2num_dict,f)

之後每個樣本需要應用,直接讀取即可,讀取命令如下。

# Loading dict and apply 
with open("str2num_dict.plk",'rb') as f:
    str2num_dict = pickle.load(f)

應用時直接使用下面命令對訓練數據和待測樣本進行操作。

for i in str2num_dict.keys():
    data_train[i] = data_train[i].apply(lambda x : str2num_dict[i].get(x))
    data_test[i] = data_test[i].apply(lambda x : str2num_dict[i].get(x))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章