Titanic是kaggle上一個練手的比賽,kaggle平台提供一部分人的特征,以及是否遇難,目的是預測另一部分人是否遇難。目前抽工作之余,斷斷續續弄了點,成績為0.79426。
在這個比賽過程中,接觸並了解了一些數據挖掘比賽的基本流程,現記錄一下。
1. 分析數據
- 因為數據量比較小,train有800多條數據,test有400多條數據,因此這里用了execl的數據透視表分析。
- 同時python提供pandas庫,可以很好的分析數據。
2. 缺失值填充
關於Age,Fare,Embarked三個字段有缺失,官方給了個利用中位數或者眾數的做法,同樣的我們也可以利用隨機森林等機器學習模型來填補缺失值。當然這里我采用的官方的做法,效果不錯。
##利用眾數填充Embarked缺失值prodata.Embarked[ prodata.Embarked.isnull() ] = prodata.Embarked.dropna().mode().values##利用中位數填充Age缺失值median_age = prodata['Age'].dropna().median()prodata.loc[ (prodata.Age.isnull()), 'Age'] = median_age##根據Pclass將人分成3組,然后利用每組的中位數填充Fare缺失值median_fare = numpy.zeros(3)for f in range(0,3): median_fare[f] = prodata[prodata.Pclass == f+1 ]['Fare'].dropna().median()for f in range(0,3): prodata.loc[ (prodata.Fare.isnull()) & (prodata.Pclass == f+1 ), 'Fare'] = median_fare[f]
3. 數據處理
3.1 轉換為虛擬變量
數據中常常有無法比較大小的值,比如Embarked代表去哪個地方,這個時候如果要使用lr這類的模型,我們需要將Embarked變為虛擬變量,也是啞變量。
舉個例子:Embarked這里取得3種值,假設為A、B、C。這里我們就可以用2個新特征標識Embarked,分別是Embarked_A、Embarked_B。
Embarked = “A” => Embarked_A = 1 Embarked_B = 0
Embarked = “B” => Embarked_A = 0 Embarked_B = 1
Embarked = “C” => Embarked_A = 0 Embarked_B = 0
這里不能再添加一個新的特征Embarked_C,原因是如果在添加一個特征會使得特征完全共線性,導致模型無法估計。具體詳細見虛擬變量陷阱。
##將Embarked轉換為啞變量dummies_df = pandas.get_dummies(prodata.Embarked)dummies_df = dummies_df.rename(columns=lambda x:'Embarked_'+str(x))prodata = pandas.concat([prodata,dummies_df.iloc[:,:-1]],axis=1)
3.2 歸一化
歸一化的方法有很多,比如線性函數歸一化,Z-score標准化。后者要求原始數據分布為正態分布。
##標准化歸一化Ageprodata['Age_Scaled'] = preprocessing.StandardScaler().fit_transform(prodata.Age)
3.3 離散化(分區間)
將數值類的數據划分成幾個區間,這里采用的分位數划分pandas.qcut。
##將Age分成6個區間,然后變化成區間idAge_bin = pandas.qcut(prodata.Age, 6)prodata['Age_bin_id'] = pandas.factorize(Age_bin)[0]+1
3.4 數據平滑
因為Fare這一列有一些為0的數據,因此對等於0的部分,稍微做一些平滑處理。
##平滑處理Fare為0的數據prodata['Fare'][numpy.where(prodata['Fare']==0)[0]] = prodata['Fare'][prodata.Fare.nonzero()[0] ].min() / 100
4. 提煉高級特征
- 參照了別人的博客,從Name里面提煉了一些Mr,Mrs等特征,然后轉換成啞變量。
- 對一些特征進行加減乘除,在下一步降維,以及特征篩選的時候使用。
5. 降維以及特征篩選
5.1 PCA降維
參照博客,對lr使用了PCA降維,但是效果並不好。
X = prodata.values[:, 1::]y = prodata.values[:, 0] variance_pct = .99pca = PCA(n_components=variance_pct) X_transformed = pca.fit_transform(X,y) pcaDataFrame = pandas.DataFrame(X_transformed)
5.2 特征篩選
針對如此多的特征,這里可以根據隨機森林在訓練之后產生的一個特征重要性來篩選特征。
forest = forest.fit( train_data[0::,1::], train_data[0::,0] )feature_importance = forest.feature_importances_feature_importance = 100.0 * (feature_importance / feature_importance.max())fi_threshold = 10important_idx = numpy.where(feature_importance > fi_threshold)[0]important_features = prodata[''][important_idx]print "\n", important_features.shape[0], "Important features(>", \ fi_threshold, "% of max importance)...\n"#, \ important_featuressorted_idx = numpy.argsort(feature_importance[important_idx])[::-1]get the figure about important featurespos = numpy.arange(sorted_idx.shape[0]) + .5plt.subplot(1, 2, 2)plt.title('Feature Importance')plt.barh(pos, feature_importance[important_idx][sorted_idx[::-1]], \ color='r',align='center')plt.yticks(pos, important_features[sorted_idx[::-1]])plt.xlabel('Relative Importance')plt.draw() plt.show()train_df = train_df.iloc[:, important_idx].iloc[:, sorted_idx].valuestest_df = test_df.iloc[:,important_idx
6. 交叉驗證
sklearn自帶有cross_validation,可以進行交叉驗證。具體的cross_validation用法參考:Cross-validation: evaluating estimator performance。
cross_validation.cross_val_score(lr,train_data[0::,1::],train_data[0::,0],cv=5,scoring='precision')
7. 參考資料:
- 【原】關於使用sklearn進行數據預處理 —— 歸一化/標准化/正則化:http://www.cnblogs.com/chaosimple/p/4153167.html
- kaggle數據挖掘競賽初步:http://www.cnblogs.com/north-north/p/4353365.htmlhttp://www.cnblogs.com/north-north/p/4354775.htmlhttp://www.cnblogs.com/north-north/p/4358084.htmlhttp://www.cnblogs.com/north-north/p/4360121.html
- Kaggle系列——Titanic 80%+精確度紀錄:http://blog.csdn.net/yobobobo/article/details/48194021
- wiki 啞變量:https://en.m.wikipedia.org/wiki/Dummy_variable_%28statistics%29
- PCA:http://sebastianraschka.com/Articles/2014_pca_step_by_step.html
- scikit-learn中PCA的使用方法: http://blog.csdn.net/u012162613/article/details/42192293
- 干貨:結合Scikit-learn介紹幾種常用的特征選擇方法:http://dataunion.org/14072.html?utm_source=tuicool
- Cross-validation: evaluating estimator performance:http://scikit-learn.org/stable/modules/cross_validation.html