1. 程式人生 > >用pandas處理缺失值補全及DictVectorizer特徵轉換

用pandas處理缺失值補全及DictVectorizer特徵轉換

下面介紹的是用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機器學習及實踐