在 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 代表沒有獲救),其餘是一些個人資訊
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()
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_*** = pd.get_dummies(data_train['***'], prefix= '***')
dummies_pclass = pd.get_dummies(data_train['pclass'], prefix= 'pclass')
df = pd.concat([data_train, dummies_embarked, dummies_***, dummies_pclass], axis=1)
df.drop(['pclass', 'name', '***', '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_.*|***_.*|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數學愛好者
編 / 熒聲
刷題入門20201112
使用leetcode進行刷題 一直不太理解leetcode裡面答案到底應該怎麼寫,因為在右邊就乙個classsolution,不知道應該寫成什麼樣子。就像這樣 class solution def twosum self,nums list int target int list int 前面害勉強...
關於刷題入門 簡單題操作 的總結
一 判斷乙個數的奇偶性 判斷奇偶性 只需要對2取模即可,模為1位奇數,反之為偶 int a if a 2 1 else 二 判斷閏年 1 能整除4且不能整除100 2 能整除400 二者成立乙個即可 int y if y 400 0 y 4 0 y 100 0 else 三 判斷三邊是否能夠構成乙個...
pwn入門刷題 starting(1)
1 首先,執行基本步驟 前篇已經說過了 看圖 2 接下來,開啟64位的ida 3 在左邊的函式視窗裡面找到main函式,開啟它,tab鍵可以切換反彙編檢視與偽 檢視。3 雙擊vulnerable function 函式,可以看到這個函式的 如下 4 現在我們看到乙個問題,buf的長度只有80h,卻可...