下列數(shù)據(jù)來源Kaggle的Titanic題目
特征分類
- 定量特征:如年齡、票價等有數(shù)量關(guān)系的特征鞠苟,可二值化或函數(shù)變換
- 定性特征:如性別当娱、幾等艙等沒有數(shù)量意義的特征,可啞編碼或函數(shù)變換
??定量特征 與 定性特征 需要分開處理
二值化 Binarizer
定量特征二值化的核心在于設(shè)定一個閾值态秧,大于閾值的賦值為1,小于等于閾值的賦值為0
from sklearn.preprocessing import Binarizer
binarizer = Binarizer(threshold=18, copy=True)
data['Adult'] = binarizer.fit_transform(data['Age'])
# 等同
data['Adult'] = (data['Age'] > 18).astype(int)
啞編碼 OneHotEncoder
??數(shù)據(jù)集中有很多變量類型是Nominal的愤诱,對于某些算法而言淫半,完全的Nominal類型的變量是無法計算的,這就需要進行啞編碼昏滴。
??啞編碼是一種狀態(tài)編碼对人,可將定性特征轉(zhuǎn)為數(shù)字牺弄,但這些數(shù)字沒有大小關(guān)系。該特征有N類就有N位蛇捌,某位對應一類咱台,是該類標則該位標1回溺,其余位標0混萝,如:001
譬圣,010
雄坪,100
维哈,最終形成稀疏矩陣。
from sklearn.preprocessing import OneHotEncoder
# 幾等艙Pclass(1等艙, 2等艙, 3等艙)
data['Pclass'] = OneHotEncoder().fit_transform(data['Pclass'].reshape(-1 ,1))
# 輸出
print data['Pclass'].toarray()
[ [ 0. 0. 1.]
...
[ 0. 1. 0.] ]
??這里遇到一個問題:OneHotEncoder編碼Embarked會報錯ValueError: could not convert string to float: Q
飘庄,暫時未找到解決方法跪削,若要好的解決方法請留言迂求,謝謝。
重建定性特征 pandas.get_dummies
- 定性特征只有
是
與非
毫玖,因此也可拆分為多個二值化特征:
dummies_pclass = pd.get_dummies(data['Pclass'], prefix='Pclass')
print dummies_pclass.head(2)
|Pclass_1 |Pclass_2 |Pclass_3 |
| 0.0 | 0.0 | 1.0 |
| 1.0 | 0.0 | 0.0 |
- 若像性別一樣付枫,只有兩種類別阐滩,且非此即彼县忌,則可:
data.loc[data.Sex == 'female', 'Sex'] = 1
data.loc[data.Sex == 'male', 'Sex'] = 0
print data.Sex.head(2)
| Sex |
| 0 |
| 1 |
- 對于缺失的特征,重建特征后每個標簽值都為0:
# Embarked 登船港口有兩條數(shù)據(jù)為null衅疙,重建特征后每個標簽值為0
dummies_embarked = pd.get_dummies(data['Embarked'], prefix='Embarked')
print dummies_embarked.loc[61] #其中Embarked為nan的數(shù)據(jù)
|Embarked_C |Embarked_Q |Embarked_S |
| 0.0 | 0.0 | 0.0 |
構(gòu)造非線性特征
原因:線性模型就是把特征對分類結(jié)果的作用加起來(例如:Y = T1 + T2)饱溢,但線性模型無法表示一些非線性的關(guān)系(如:Y = T1 * T2)绩郎,所以我們打算人工構(gòu)造一些新特征,彌補線性模型對非線性表達式表達能力的不足溉仑。
特征的非線性的表達式可以分兩種:
- 表達“數(shù)值特征”本身的非線性因素浊竟。
#方式一:將原有數(shù)值的高次方作為特征振定,x^y或lnx
df['Age*Age_scaled'] = scaler.fit_transform(data['Age'] * data['Age'])
#方式二:數(shù)據(jù)離散化(將連續(xù)的數(shù)值劃分為區(qū)間)
df['Child'] = (data['Age'] <= 18).astype(int)
- 表達特征與特征之間存在的非線性關(guān)聯(lián),并且這種關(guān)聯(lián)關(guān)系對分類結(jié)果有幫助后频。
#設(shè)想頭等艙的人能受到更好的保護待遇卑惜,同時年齡越小的越優(yōu)先被救助露久,所以這兩個特征是否有一些關(guān)聯(lián)
df['Age*Pclass_scaled'] = scaler.fit_transform(data['Age'] * data['Pclass'])
特征合并、刪除、篩選
df = pd.concat([df, dummies_embarked, dummies_sex, dummies_pclass, dummies_cabin], axis=1) #axis=0(index),1(columns)
df.drop(['Pclass','Name','Sex', 'Ticket','Cabin','Embarked','Fare', 'Age'], axis=1, inplace=True)
df = df.filter(regex='Survived|Age_.*|SibSp|Parch|Child|Cabin_.*|Embarked_.*|Sex_.*|Pclass_.*')
np_array = df.as_matrix() #將DataFrame轉(zhuǎn)為Numpy-array
pandas.concat
pandas.DataFrame.drop
pandas.DataFrame.filter
pandas.DataFrame.as_matrix