用pandas處理缺失值補全及DictVectorizer特徵轉換
阿新 • • 發佈:2019-01-27
下面介紹的是用pands讀取泰坦尼克遇難船員的資料,然後挑選特徵,補全缺失值,特徵轉換。
1.pands讀取資料
titanic=pd.read_csv('./titanic.txt')
其資料形式如下:
|row_num |pclass|survived|name|age|embarked|home.dest|room|ticket|boat|sex|
| -------- | :----: |
|3|1st|0|Allison|30.|Southampton|Montreal|C26||(135)|male|
使用Pandas讀入的資料都有pandas獨有的dataframe格式,使用info()可檢視資料的統計特性
print titanic.info() >> >> RangeIndex: 1313 entries, 0 to 1312 #資料集一共有1313個樣本0-1312 Data columns (total 11 columns): #一共有11列 row.names 1313 non-null int64 #有1313個,型別為整型 pclass 1313 non-null object #有1313個,型別物件型,如字串 survived 1313 non-null int64 #有1313個,型別為整型 name 1313 non-null object #有1313個,型別為物件 age 633 non-null float64 #有633個(即有680個缺失值) embarked 821 non-null object # 以下同理,不表 home.dest 754 non-null object room 77 non-null object ticket 69 non-null object boat 347 non-null object sex 1313 non-null object dtypes: float64(1), int64(2), object(8)
2.挑選特徵
我們知道,在原始資料集中,並不是所有的特徵對於訓練都有用;所以我們就要根據相關背景來進行篩選。此處我們選取sex,age,pclass這三個維度的特徵用於訓練。
X=titanic[['pclass','age','sex']] y=titanic['survived'] print X >> >> pclass age sex 0 1st 29.0000 female 1 1st 2.0000 female 2 1st 30.0000 male 3 1st 25.0000 female 4 1st 0.9167 male 5 1st 47.0000 male 6 1st 63.0000 female 7 1st 39.0000 male 8 1st 58.0000 female 9 1st 71.0000 male 10 1st 47.0000 male 11 1st 19.0000 female ... ... ... ... print X.info() >> >> [1313 rows x 3 columns] <class 'pandas.core.frame.DataFrame'> RangeIndex: 1313 entries, 0 to 1312 Data columns (total 3 columns): pclass 1313 non-null object age 633 non-null float64 sex 1313 non-null object dtypes: float64(1), object(2) memory usage: 30.8+ KB
此時我們可以看到,X中就只有三個維度了;但從X.info()中我們可以看出:
①維度age中仍然有缺失值,需要補全;
②維度pclass和sex維度均為物件值,要進行特徵轉換;
3.缺失值補全
首先我們需要補充age裡的資料,通常使用平均數或者中位數都是對模型偏離造成最小影響的策略。
X['age'].fillna(X['age'].mean(),inplace=True)
print X.info()
>>
>>
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1313 entries, 0 to 1312
Data columns (total 3 columns):
pclass 1313 non-null object
age 1313 non-null float64
sex 1313 non-null object
dtypes: float64(1), object(2)
memory usage: 30.8+ KB
可以看到,此時已經不存在缺失值了。
4.特徵轉換
先解釋一下特徵轉換,我們知道物件型別的資料是無法進行計算的,所有我們就需要將其轉換成其他形式;最直接的就是轉換成0,1值,比如性別這個維度就可以用0,1來代替。但是如果有三種類型呢?比如某個維度有great,good,bad有三種取值,那麼該如何轉換呢?這兒用到的方法就是將這一個維度展開成三個維度,即great,good,bad分別構成一個維度,每個維度都用0,1取值來處理。
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.25,random_state=33)#在進行特徵轉換之前,我們先對資料集進行切分
vec=DictVectorizer(sparse=False) #sparse=False意思是不用稀疏矩陣表示
X_train=vec.fit_transform(X_train.to_dict(orient='record'))
X_test=vec.transform(X_test.to_dict(orient='record'))
print vec.feature_names_ #檢視轉換之後的特徵維度
print X_train # 轉換後的訓練集
>>
>>
['age', 'pclass=1st', 'pclass=2nd', 'pclass=3rd', 'sex=female', 'sex=male']
[[ 31.19418104 0. 0. 1. 0. 1. ]
[ 31.19418104 1. 0. 0. 1. 0. ]
[ 31.19418104 0. 0. 1. 0. 1. ]
...,
[ 12. 0. 1. 0. 1. 0. ]
[ 18. 0. 1. 0. 0. 1. ]
[ 31.19418104 0. 0. 1. 1. 0. ]]
此時我們就等到了處理好的完整的資料集,就可以將其用於訓練了。
參考:
- Python機器學習及實踐