Kaggle 是一個用來學習、分享和競賽的線上數據實驗平臺,有點相似 KDD—CUP(國際知識發現和數據挖掘競賽),企業或者研究者能夠將背景、數據、指望指標等發佈在 kaggle 上,用競賽的方式向全世界的數據科學家和愛好者尋求解決方案。熱愛數(dong)據(shou)挖(zhe)掘(teng)的小夥伴們能夠下載/分析數據,使用統計/機器學習/數據挖掘等方面的知識,創建算法模型,得出結果並提交,排名靠前可能還會有獎勵哦!前端
https://www.kaggle.com/c/titanicpython
泰坦尼克號問題背景算法
說明微信
在 Data 下咱們會看到官方給的 train.csv 和 test.csv 兩個文件,分別是訓練和測試數據。咱們可使用 virtualenv 來建立一個「隔離」的 python 應用環境(虛擬環境)。在這裏,你不須要考慮系統原有庫的版本,只須要 pip 來管理你須要用到的一切。dom
import pandas as pd import numpy as np from pandas import Series,DataFrame data_train = pd.read_csv("./train.csv") pd.DataFrame(data_train)
pandas 是經常使用的 python 數據處理包,把 csv 文件讀入成 dataframe 格式,在 jupyter notebook 中,能夠看到咱們的數據長什麼樣:機器學習
咱們就能夠把它看做一張 excel 表格,共有 12 列,891 行(表明在 train_csv 中共有 891 個乘客)。Survived 字段表明該乘客是否獲救(1 表明獲救,0 表明沒有獲救),其他是一些我的信息性能
data_train.info()
這裏告訴了我麼一些關於 data_train 的基本信息,好比共有 891 個乘客,可是有些字段的數據不全。好比 Age(年齡)、Cabin(客艙信息)。學習
data_train.describe()
在這裏咱們看到了什麼信息呢?從 mean 行中約有 0.38 的人最後獲救了,乘客的平均年齡爲 29.7 歲,平均票價爲 32.20測試
每一個乘客大概有 12 種屬性提供給咱們,僅僅對於上面兩行操做對於數據的瞭解還沒法爲咱們提供想法和思路,咱們如今不知道哪些有用哪些對於模型沒有用,因此到了最關鍵的特徵工程環節。咱們知道最終的 output 是 Suvived,如今須要尋找最後的 Survived 與各個屬性之間有着什麼樣的內在關係。從大副的口中已經得知「要首先考慮婦女和兒童」。優化
for x in data1_x: if data1[x].dtype != 'float64' : print('Survival Correlation by:', x) print(data1[[x, Target[0]]].groupby(x, as_index=False).mean()) print('-'*10, '\n') print(pd.crosstab(data1['Title'],data1[Target[0]]))
在本圖中,咱們發現女性有 0.74 活下來,而男性只有 0.18。歪果盆友果真很尊重 lady,lady first 踐行得不錯。性別無疑要做爲重要特徵加入最後的模型之中。在 Pclass 中,客艙爲等級 1 的乘客獲救的機率高不少,嗯這個必定也影響最後獲救的結果(等級高的乘客必定也更有錢)。
fig = plt.figure() fig.set(alpha=0.2) Survived_0 = data_train.Pclass[data_train.Survived == 0].value_counts() Survived_1 = data_train.Pclass[data_train.Survived == 1].value_counts() df=pd.DataFrame({'Survived':Survived_1, 'unSurvived':Survived_0}) df.plot(kind='bar', stacked=True) plt.title("Survived status of all passenger classes") plt.xlabel("passanger's level") plt.ylabel("number") plt.show()
從本圖中咱們能夠看到,明顯若是你是等級爲 1 的乘客,你的獲救機率就會很高。對了,這也是會最終影響輸出的獲救結果的一個特徵。
data_train.Age[data_train.Pclass == 1].plot(kind='kde') data_train.Age[data_train.Pclass == 2].plot(kind='kde') data_train.Age[data_train.Pclass == 3].plot(kind='kde') plt.xlabel("age")# plots an axis lable plt.ylabel("dendity") plt.title("Age distribution of passengers levels") plt.legend(('first level', 'second level','third level'),loc='best')
從各等級乘客的年齡分佈中,咱們能夠看到「不一樣艙位/乘客等級可能和財富/地位有關係,最後獲救機率可能會不同」,因此年齡也會是影響咱們最終結果的緣由之一。
咱們對大致數據已經看過一遍了,對於感興趣的屬性也有了大概的瞭解。如今咱們須要 簡單處理一下這些數據,爲機器學習建模作點準備了。先從最突出的數據屬性開始吧,Cabin 和 Age,由於這兩項有些乘客的信息不包含它們,有丟失的數據對於下一步的工做影響太大。
先說 Cabin,暫時咱們就按照剛纔說的,按 Cabin 有無數據,將這個屬性處理成 Yes 和 No 兩種類型吧。
再說 Age:
一般遇到缺值的狀況,咱們會有幾種常見的處理方式
本例中,由於 Cabin 不是影響最終結果的特徵之一。因此直接考慮別的須要用到的特徵(性別,等級,等級),並將其中的類目型轉化爲數值型特徵,咱們可使用 pandas 的「get_dummies」來完成這個工做,並接在原來的「data_train」上
dummies_Embarked = pd.get_dummies(data_train['Embarked'], prefix= 'Embarked') dummies_Sex = pd.get_dummies(data_train['Sex'], prefix= 'Sex') dummies_Pclass = pd.get_dummies(data_train['Pclass'], prefix= 'Pclass') df = pd.concat([data_train, dummies_Embarked, dummies_Sex, dummies_Pclass], axis=1) df.drop(['Pclass', 'Name', 'Sex', 'Ticket', 'Embarked'], axis=1, inplace=True) df
na!咱們將這些類目屬性成功轉化爲 0,1 的數值屬性了。這樣看來,好像差很少都完成了,但是若是再看看 Age 和 Fare 兩個屬性,乘客關於這兩個屬性的數值變化幅度也太大了!!若是你們瞭解邏輯迴歸與梯度降低的話,會知道各屬性之間的 scale 差距太大,將對收斂速度形成很大的傷害(甚至不收斂)... 因此咱們先用 scikit-learn 裏面的 preprocessing 模塊對這兩個屬性作一個處理(就是將變化幅度較大的特徵化到 [-1,1] 內)
import sklearn.preprocessing as preprocessing scaler = preprocessing.StandardScaler() age_scale_param = scaler.fit(df['Age']) df['Age_scaled'] = scaler.fit_transform(df['Age'], age_scale_param) fare_scale_param = scaler.fit(df['Fare']) df['Fare_scaled'] = scaler.fit_transform(df['Fare'], fare_scale_param) df
嗯,這樣初級的數據處理就完成的差很少了
我麼把須要的 feature 字段提取出來,轉成 numpy 格式,使用 scikit-learn 中的 LogisticRegression 建模。
from sklearn import linear_model # 用正則取出咱們要的屬性值 train_df = df.filter(regex='Survived|Age_.*|SibSp|Parch|Fare_.*|Cabin_.*|Embarked_.*|Sex_.*|Pclass_.*') train_np = train_df.as_matrix() # y 即 Survival 結果 y = train_np[:, 0] # X 即特徵屬性值 X = train_np[:, 1:] # fit 到 RandomForestRegressor 之中 clf = linear_model.LogisticRegression(C=1.0, penalty='l1', tol=1e-6) clf.fit(X, y) clf
OK!!!經過這樣建模後,咱們獲得一個 model,而後再把 test.csv 經過一樣的數據簡單處理後,就能夠獲得預測結果了。
等等,你覺得這樣就完了麼。這其實只完成了剛剛開始的一步,咱們只是作了一個 baseline model,一切都仍是基礎的,咱們還須要優化。
不過在如今的場景下,先不着急作這個事情,咱們這個 baseline 系統還有些粗糙,先再挖掘挖掘。
文 / joeCDC
數學愛好者編 / 熒聲
本文已由做者受權發佈,版權屬於創宇前端。歡迎註明出處轉載本文。本文連接:https://knownsec-fed.com/2018...
想要訂閱更多來自知道創宇開發一線的分享,請搜索關注咱們的微信公衆號:創宇前端(KnownsecFED)。歡迎留言討論,咱們會盡量回復。
歡迎點贊、收藏、留言評論、轉發分享和打賞支持咱們。打賞將被徹底轉交給文章做者。
感謝您的閱讀。