在特徵處理中,有一些特徵裏面的值是一些可分類的字符串,舉個例子:
姓名 | 學歷 | 收入 |
---|---|---|
小張 | 高中 | 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))