數據挖掘 workfolw 總結

  
我的將數據挖掘的流程簡單表示爲「 數據特徵模型 」。
 
  • 首先,明確問題的性質和任務(分類、迴歸、聚類、推薦、排序、關聯分析、異常檢測等);
  • 其次,理解數據(含義、類型、值的範圍),並經過描述性統計分析(describing data)和可視化分析(visualizing data)等工做對數據進行探索性分析(exploratory data analysis, EDA);
  • 而後,明確與預測結果顯著相關的特徵/變量(以kaggle-Titanic爲例),進行數據預處理(特徵選擇、特徵工程);
  • 最後,進行模型選擇、建模、調參、交叉驗證、模型評估,並得出最終的解決方案。
 
思考下來整個數據建模的過程,重點不在於建模,而在於前者,即如何理解數據,處理數據,針對模型的需求和特色作數據工程、特徵工程,將數據以更好的方式特徵化。在實際的數據挖掘過程當中,前者佔據差很少70%的工做量。

以 Titanic 爲例,如下是數據挖掘 workflow 總結。html

明確任務目標:預測泰坦尼克號的乘客是否生還。它是個二分類任務,生還爲1,不然爲0。正則表達式

前期準備:導入相應的庫

pandas → 載入數據
matplotlibseaborn → 可視化
sklearn → 機器學習
 
# data analysis and wrangling
import pandas as pd
import numpy as np
import random as rnd

# visualization import seaborn as sns import matplotlib.pyplot as plt # machine learning from sklearn.linear_model import LogisticRegression from sklearn.svm import SVC,LinearSVC from sklearn.ensemble import RandomForestClassifierfrom sklearn.tree import DecisionTreeClassifier ......

 

step 1. 讀取數據

使用Pandas DataFrame讀取數據。
# 使用Pandas DataFrame讀取數據

train_df = pd.read_csv('./xxx/train.csv')
test_df = pd.read_csv('./xxx/test.csv')
combine = [train_df, test_df]

 

step 2.1 描述性統計分析

  • 查看總共有哪些特徵;
    •  ['PassengerId' 'Survived' 'Pclass' 'Name' 'Sex' 'Age' 'SibSp' 'Parch' 'Ticket' 'Fare' 'Cabin' 'Embarked'] 共12個特徵/變量
  • 簡單展現數據;
  • 查看數據的類型和缺失值;分辨清楚數據的類型有助於挑選合適的圖案進行可視化。
  • 查看數據離散分佈狀況(箱型圖:均值、標準差、最小值、分位數、最大值、衆數、中位數),描述事件整體狀況及相關細節。
  • 查看離散型變量的分佈狀況。
# column 列名 index 行名  查看總共有哪些特徵
print(train_df.columns.values)
# preview the data
train_df.head() train_df.tail()
# 查看數據類型和缺失值
train_df.info() print('_'*40) test_df.info()
# 查看數據離散分佈狀況
train_df.describe()
# 只輸出離散型變量的分佈狀況
train_df.describe(include=['O'])

 

下圖介紹了不一樣的數據類型。數據能夠按 Nominal(名義)、Ordinal(順序)、Interval(區間) 以及 Ratio(比率) 分;也能夠按 Discrete (離散)、Continuous (連續)分;還能按照 Int (整數)、Float (浮點數)或者 String (字符串)、Object (對象)區分。算法

 

數據觀察和假設

Correlatingapp

咱們想知道哪些特徵與 Survival 相關。dom

Completing機器學習

  1. 咱們想填充 Age 特徵的缺失值,由於這個特徵與 Survival 顯著相關。
  2. 咱們也想填充 Embarked 特徵由於它可能與 Survival 相關。

Correcting學習

  1. Ticket 特徵可能會在咱們的分析中被移除,由於它有較高的重複率(24%),所以 Ticket 與 Survival 之間可能不存在聯繫。
  2. Cabin 特徵可能會被移除,由於它在訓練集以及測試集中存在大量缺失值。
  3. PassengerID 可能會被移除,由於它對 Survival 沒有貢獻。
  4. Name 特徵不是非標準的數據,不能直接對 Survival 產生貢獻,所以可能被移除。

Creating測試

  1. 咱們可能基於 Parch 和 SibSp 新建一個 「Family」 特徵,計算每一個家庭登船的總成員數。
  2. 咱們可能要從 Name 特徵裏提取新特徵 Title 
  3. 咱們可能根據 Age 進行分組,新建特徵。將連續型數值特徵轉化爲次序級分類特徵。
  4. 咱們也可能建立 Fare 分類特徵若是它有助於咱們進行分析。

Classifingui

  1. Women(Sex=Female)更容易倖存下來。
  2. Children(Age<?)更容易倖存下來。
  3. The upper-class passengers(Pclass=1)更容易倖存下來。

 

step 2.2 旋轉特徵分析

特徵,即變量。在建模以前,咱們要尋找與預測結果顯著相關的特徵【特徵選擇】,判斷哪些特徵與預測結果具有顯著相關性(正相關或者負相關)。spa

爲了證明咱們的假設,咱們能夠經過旋轉特徵來分析特徵的相關性。在這一階段,咱們只能分析不存在缺失值的特徵。好比 categorical(Sex)ordinal(Pclass)以及discrete(SibSp,Parch)類型的特徵。

    • Pclass
      一等座(Pclass=1)的倖存率高達62%,符合假設(classifing #3).
    • Sex
      女性的倖存率(Sex=Female)高達74%,符合假設(classifing #1).
    • SibsP和Parch
      對於肯定的值沒有顯著相關性。建議建立新特徵(creating #1).
# 分別計算一等座、二等座、三等座的存活率,並按存活率從高到低進行排序
train_df[['Pclass', 'Survived']].groupby(['Pclass'],as_index=False).mean().sort_values(by='Survived', ascending=False)
# 得出結果 存活率:一等座>二等座>三等座

# 分別計算男性和女性的存活率,並按存活率從高到低排序
train_df[['Sex','Survived']].groupby(['Sex'],as_index=False).mean().sort_values(by='Survived',ascending=False)
# 得出結論 存活率:女性>男性

# 分別計算不一樣的配偶和兄弟姐妹數量的存活率,並按存活率從高到低排序
train_df[['SibSp','Survived']].groupby(['SibSp'],as_index=False).mean().sort_values(by='Survived',ascending=False)
# 分別計算不一樣的父母和子女數量的存活率,並按存活率從高到低排序
train_df[['Parch','Survived']].groupby(['Parch'],as_index=False).mean().sort_values(by='Survived',ascending=False)
# 沒有規律可循,後面建立新特徵查看

 

step 2.3 可視化分析

以 Age 變量爲例。

直方圖對於分析連續的數值變量(好比 Age )頗有用,可以經過形狀以及範圍來識別樣本特徵。直方圖還能夠指定樣本分佈的區間,有助於咱們分析特定問題(嬰兒的生還率是否更高?)。

X軸:Age

Y軸:Survived

Observations

  • 嬰孩(Age<=4)有很高的生還率。
  • 高齡乘客(80歲)倖存下來。
  • 大多數乘客年齡在15~35歲之間。
  • 15~25歲年齡段的乘客大部分沒有生還。

Decisions

這一階段的分析幫助咱們證明假設併爲後面的工做做出決定。

  • 咱們應該在模型訓練中考慮 Age(classifing #2)。
  • 咱們應該爲 Age 填補缺失值(completing #1)。
  • 咱們應該將連續的數值 Age 離散化。(creating #3)。

 

step 3 特徵工程

在特徵選擇後,根據作出的decisions,咱們要進行 特徵工程,下圖爲特徵工程的工做內容。
 

Correcting by dropping features(刪除特徵)

這是一個很好的開頭。經過刪除特徵,咱們能夠處理更少的數據點,提升運行速度,簡化分析。

根據咱們的 assumptions 和 decisions ,咱們將刪除Cabin(correcting #2)和Ticket(Correcting #1)特徵。

注意,在合適的狀況下,咱們同時對訓練集和測試集執行操做,以保持一致

print("Before", train_df.shape, test_df.shape, combine[0].shape, combine[1].shape)
# 刪除特徵 train_df
= train_df.drop(['Ticket','Cabin'], axis=1) test_df = test_df.drop(['Ticket','Cabin'], axis = 1) combine = [train_df, test_df] "After",train_df.shape, test_df.shape,combine[0].shape,combine[1].shape

 

Creating new feature extracting from existing (從現有特徵裏提取新特徵)

在刪除 Name 和 Passengerid 特徵以前,咱們嘗試從 Name 提取 Title 特徵 (頭銜/稱謂),並測試 Title 和 survival 之間的相關性。

在下面的代碼中,咱們使用正則表達式提取 Title 特徵。RegEx pattern (\w+\) 匹配 Name 特徵中以點字符結尾的第一個單詞。expand=false 標誌返回 Dataframe。

# 使用正則表達式提取 Title 特徵。RegEx pattern (\w+\) 匹配 Name 特徵中以點字符結尾的第一個單詞。expand=false 標誌返回 Dataframe。
for dataset in combine:
    dataset['Title'] = dataset.Name.str.extract('([A-Za-z]+)\.', expand=False)

pd.crosstab(train_df['Title'],train_df['Sex'])

# 用更加常見的名稱來替換大量 titles ,或者將它們歸類爲 Rare(稀有的)。
for dataset in combine:
    dataset['Title'] = dataset['Title'].replace(['Lady','Countess','Capt','Col',\
                                                 'Don','Dr','Major','Rev','Sir','Jonkheer','Dona'],'Rare')
    
    dataset['Title'] = dataset['Title'].replace('Mlle','Miss')
    dataset['Title'] = dataset['Title'].replace('Ms','Miss')
    dataset['Title'] = dataset['Title'].replace('Mme','Mrs')
    
train_df[['Title','Survived']].groupby(['Title'], as_index=False).mean()

# 將分類變量(categorical)轉換爲順序變量(ordinal)。
title_mapping = {"Mr": 1, "Miss": 2, "Mrs": 3, "Master": 4, "Rare": 5}
for dataset in combine:
    dataset['Title'] = dataset['Title'].map(title_mapping)
    dataset['Title'] = dataset['Title'].fillna(0)

train_df.head()

 

Completing a categorical feature(填充分類特徵)

Embarked 特徵涵蓋 S、Q、C 值。咱們的訓練集缺乏兩個值。咱們簡單地用衆數來進行填充。

# 衆數填充
freq_port = train_df.Embarked.dropna().mode()[0]

for dataset in combine:
    dataset['Embarked'] = dataset['Embarked'].fillna(freq_port)
    
# 旋轉特徵分析
train_df[['Embarked','Survived']].groupby(['Embarked'],as_index=False).mean().sort_values(by='Survived',ascending=False)

 

Create new feature combining existing features(從現有特徵建立新特徵)

結合 Parch 和 Sibsp, 爲 FamilySize 建立一個新特徵。這使咱們可以從數據集中刪除 Parch 和 Sibsp 。

for dataset in combine:
    dataset['FamilySize']=dataset['SibSp'] + dataset['Parch']+1
    
train_df[['FamilySize','Survived']].groupby(['FamilySize'],as_index=False).mean().sort_values(by='Survived',ascending=False)

# 建立一個名爲 IsAlone 的新特徵
for dataset in combine:
    dataset['IsAlone'] = 0
    dataset.loc[dataset['FamilySize']==1,'IsAlone']=1
    
train_df[['IsAlone','Survived']].groupby(['IsAlone'], as_index=False).mean()

 

converting a categorical feature (分類特徵離散化)

如今,將包含字符串的特徵轉換爲數值。這是大多數模型算法所要求的,同時也將幫助咱們實現特徵 completing 的目標。

首先,將 sex 特徵轉換爲一個名爲 gender 的新特徵,其中 female=1,male=0。

for dataset in combine:
    dataset['Sex'] = dataset['Sex'].map({'female':1, 'male':0}).astype(int)

train_df.head()

 

Quick completing and converting a numeric feature(快速填充和離散化數值特徵)

使用 mode 獲取 Fare 特徵最常出現的值並填充測試集中存在單個缺失值的 Fare 特徵。

test_df['Fare'].fillna(test_df['Fare'].dropna().median(),inplace=True)
test_df.head()

# 建立新特徵 FareBand
train_df['FareBand'] = pd.qcut(train_df['Fare'],4)

train_df[['FareBand','Survived']].groupby(['FareBand'],as_index=False).mean().sort_values(by='Survived',ascending=True)

# 基於 FareBand 將 Fare 特徵轉換爲 順序級
for dataset in combine:
    dataset.loc[ dataset['Fare'] <= 7.91, 'Fare'] = 0
    dataset.loc[(dataset['Fare'] > 7.91) & (dataset['Fare'] <= 14.454), 'Fare'] = 1
    dataset.loc[(dataset['Fare'] > 14.454) & (dataset['Fare'] <= 31), 'Fare']   = 2
    dataset.loc[ dataset['Fare'] > 31, 'Fare'] = 3
    dataset['Fare'] = dataset['Fare'].astype(int)

train_df = train_df.drop(['FareBand'], axis=1)
combine = [train_df, test_df]
    
train_df.head(10)

 

step 4. 模型選擇、建模和評估 

如今,訓練模型並預測解決方案。有60多種預測建模算法可供選擇。咱們必須瞭解問題的類型和解決方案的要求,以便將建模算法的選擇範圍縮小。咱們的問題是一個分類和迴歸問題,肯定輸出(存活與否)與其餘變量或特徵(性別、年齡、港口…)之間的關係。當咱們使用給定的數據集訓練模型時,咱們也在執行一類稱爲監督學習的機器學習。有了這兩個準則——監督學習加上分類和迴歸,咱們能夠將模型的選擇範圍縮小到少數。其中包括:

  • Logistic Regression
  • KNN or k-Nearest Neighbors
  • Support Vector Machines
  • Naive Bayes classifier
  • Decision Tree
  • Random Forrest
  • Perceptron
  • Artificial neural network
  • RVM or Relevance Vector Machine

Random Forrest

隨機森林模型是最流行的模型之一。隨機森林或隨機決策森林是一種用於分類、迴歸和其餘任務的集成學習方法。它在訓練時構造多個決策樹(n_estimators=100),並經過輸出類別(分類)或預測個別樹均值(迴歸)來輸出分類結果。-參考維基百科。

到目前爲止,隨機森林模型的置信度得分是全部模型中最高的。咱們決定使用此模型的輸出(y_pred)來提交預測結果。

# Random Forrest

random_forest = RandomForestClassifier(n_estimators=100)
random_forest.fit(X_train, Y_train)
Y_pred = random_forest.predict(X_test)
acc_random_forest = round(random_forest.score(X_train, Y_train)*100, 2)
acc_random_forest

保存預測結果。

submission = pd.DataFrame({
        "PassengerId": test_df["PassengerId"],
        "Survived": Y_pred
    })

submission.to_csv('submission.csv', index=False)
相關文章
相關標籤/搜索