Kaggle 是一個用來學習、分享和競賽的線上數據實驗平臺,有點相似 KDD—CUP(國際知識發現和數據挖掘競賽),企業或者研究者能夠將背景、數據、指望指標等發佈在 kaggle 上,用競賽的方式向全世界的數據科學家和愛好者尋求解決方案。熱愛數(dong)據(shou)挖(zhe)掘(teng)的小夥伴們能夠下載/分析數據,使用統計/機器學習/數據挖掘等方面的知識,創建算法模型,得出結果並提交,排名靠前可能還會有獎勵哦!前端
www.kaggle.com/c/titanicpython
在 Data 下咱們會看到官方給的 train.csv 和 test.csv 兩個文件,分別是訓練和測試數據。咱們可使用 virtualenv 來建立一個「隔離」的 python 應用環境(虛擬環境)。在這裏,你不須要考慮系統原有庫的版本,只須要 pip 來管理你須要用到的一切。算法
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 表明沒有獲救),其他是一些我的信息dom
data_train.info()
複製代碼
data_train.describe()
複製代碼
每一個乘客大概有 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]]))
複製代碼
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()
複製代碼
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
複製代碼
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
數學愛好者
編 / 熒聲
本文已由做者受權發佈,版權屬於創宇前端。歡迎註明出處轉載本文。本文連接:knownsec-fed.com/2018-12-04-…
想要訂閱更多來自知道創宇開發一線的分享,請搜索關注咱們的微信公衆號:創宇前端(KnownsecFED)。歡迎留言討論,咱們會盡量回復。
感謝您的閱讀。