1. 程式人生 > >泰坦尼克號資料探勘專案實戰——Task1 資料分析

泰坦尼克號資料探勘專案實戰——Task1 資料分析

參考資料:https://www.bilibili.com/video/av27536643

https://blog.csdn.net/aaronjny/article/details/79735998

https://github.com/AaronJny/simple_titanic

https://zhuanlan.zhihu.com/p/30538352

https://www.jianshu.com/p/9a5bce0de13f


1. 檢視資料集

import pandas as pd

# 讀取資料集
train_data = pd.read_csv('Data/train.csv')
test_data = pd.read_csv('Data/test.csv')
# 列印資訊
train_data.info()

   以上特徵含義為:

  1. PassengerId 乘客編號
  2. Survived 是否倖存
  3. Pclass 船票等級
  4. Name 乘客姓名
  5. Sex 乘客性別
  6. SibSp、Parch 親戚數量
  7. Ticket 船票號碼
  8. Fare 船票價格
  9. Cabin 船艙
  10. Embarked 登入港口

2. 特徵選擇

根據經驗,認為乘客編號、乘客姓名、船票號碼、船艙跟逃生機率無關,所以初步選擇 ['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked'] 作為訓練特徵。從打印出來的資料可以發現,序號是891個,但是並不是所有的特徵都滿足891,所以某些特徵存在缺失值。

# 選擇用於訓練的特徵
features = ['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked']
x_train = train_data[features]
x_test = test_data[features]

y_train=train_data['Survived']

# 檢查缺失值
x_train.info()
print('-'*100)
x_test.info()

 


3. 特徵缺失值處理

所以我們發現,訓練資料中的Age,Embarked,測試資料 Age,Fare,Embarked。送入模型中的標籤和特徵要可以一一對應,所以要麼丟掉特徵不完整的樣本,要麼填充。秉著儘可能使用樣本的態度,我們選擇填充特徵。

如何補全資料集呢?最簡單的方法:對於數值型資料,可以使用其平均值/中位數填補空值,儘量減小填補值對結果的影響。對於類別資料,可以使用眾數來填補。稍微進階一些的,可以藉助其他輔助特徵:例如測試資料中Fare缺失的資料,每個乘客的Ticket是唯一的,無法通過查詢相同的票號加個來填補,但是,船票價格往往跟 Pclass (客艙等級)及 Cabin(客艙號)有關的,因此使用具有相同PclassCabin的中位數或著眾數來填補。 

這裡先採用最簡單的方法進行填補。

# 使用平均年齡來填充年齡中的nan值
x_train['Age'].fillna(x_train['Age'].mean(), inplace=True)
x_test['Age'].fillna(x_test['Age'].mean(),inplace=True)

# 使用票價的均值填充票價中的nan值
x_test['Fare'].fillna(x_test['Fare'].mean(),inplace=True)

# 使用登入最多的港口來填充登入港口的nan值
print x_train['Embarked'].value_counts()
x_train['Embarked'].fillna('S', inplace=True)
x_test['Embarked'].fillna('S',inplace=True)

4. 特徵值轉換為特徵向量

機器學習中,送入模型的是矩陣,而上述特徵中並不是所有的特徵都是數值型的,需要把一些非數值型的特徵轉為數值。例如性別,我們可以簡單的想到“0”,“1”來代表,那麼“Embarked”的"C","Q","S" 要選擇用“0”,“1”,“2”來代替嗎?若兩個特徵之間的距離是,d(C, Q) = 1, d(Q, S) = 1, d(C, S) = 2。那麼C和S工作之間就越不相似嗎?顯然這樣的表示,計算出來的特徵的距離是不合理。那如果使用one-hot編碼,則得到C = (1, 0, 0), Q= (0, 1, 0), S = (0, 0, 1),那麼兩個工作之間的距離就都是sqrt(2).即每兩個特徵之間的距離是一樣的,顯得更合理。因此,我們使用 one-hot編碼。

# 將特徵值轉換成特徵向量
dvec=DictVectorizer(sparse=False)

x_train=dvec.fit_transform(x_train.to_dict(orient='record'))
x_test=dvec.transform(x_test.to_dict(orient='record'))

# 列印特徵向量格式
print (dvec.feature_names_)

因此,將特徵值轉換為特徵向量後的格式:

例如列印一條資料,具體內容:

print (x_train[100])

特徵向量的值與上面的名稱一一對應。