下面是我看到的一些數據處理以及訓練的方法,主要是python的。
best paactices
Performing feature correlation analysis early in the project.在項目初期進行特征相關分析。
Using multiple plots instead of overlays for readability.使用多個繪圖而不是覆蓋可讀性。
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
%matplotlib inline
machine learning機器學習
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC, LinearSVC
from sklearn.ensemble import RandomForestClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.linear_model import Perceptron
from sklearn.linear_model import SGDClassifier
from sklearn.tree import DecisionTreeClassifier
獲取數據
pandas包是數據處理的非常重要的包,可以用來獲取處理和清理
train_df = pd.read_csv(‘../input/train.csv’)
test_df = pd.read_csv(‘../input/test.csv’)
combine = [train_df, test_df]
df.columns.size #獲取列數
df.iloc[:, 0].size #獲取行數
直接導出列名
print(train_df.columns.values)
[‘PassengerId”Survived”Pclass”Name”Sex”Age”SibSp”Parch”Ticket”Fare”Cabin”Embarked’]
列出數據集的各特征的類型,可以方便我們選取
train_df.info() 列出列名,數量,數據類型
train_df.head() 開始5行
train_df.tail() 結束5行
可以很好的看到數據的分布,或者檢查是否有數據缺失
train_df.describe() 數據的描述(總數,平均值,std,最大\小值25%,50%,75%)對於數據的快速統計匯總
找出特征有幾個出現的不同值,以及頻率最高
train_df.describe(include=[‘O’])
通過groupby找出該特征與目標之間的關聯
train_df[[‘Pclass’,Survived’]].groupby([‘Pclass’],as_index=False).mean().sort_values(by=’Survived’, ascending=False)
通過可視化工具,可以查看到一些特征,比如各年齡段和生存的相關性
g = sns.FacetGrid(train_df, col=’Survived’)
g.map(plt.hist, ‘Age’, bins=20)
比如age小於4的生存幾率高,80歲的生存,大部分乘客是15-35,且15-25大量沒有生存
直方圖縱向擴展,可以組合看到多個類別的比較
grid = sns.FacetGrid(train_df, col=’Survived’, row=’Pclass’, size=2.2, aspect=1.6)
grid.map(plt.hist, ‘Age’, alpha=.5, bins=20)
grid.add_legend();
散點圖將非數字型的特征進行關聯(是否登記和性別對生存的影響)
grid = sns.FacetGrid(train_df, row=’Embarked’, size=2.2, aspect=1.6)
grid.map(sns.pointplot, ‘Pclass’, ‘Survived’, ‘Sex’, palette=’deep’)
grid.add_legend()
條形圖將非數字型和數字型的特征進行關聯,考慮將fare高低加入特征
grid = sns.FacetGrid(train_df, row=’Embarked’, col=’Survived’, size=2.2, aspect=1.6)
grid.map(sns.barplot, ‘Sex’, ‘Fare’, alpha=.5, ci=None)
grid.add_legend()
清洗數據
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]
2.從現有的數據中提取新特征
找出每個name縮寫的人數
for dataset in combine:
dataset[‘Title’] = dataset.Name.str.extract(’ ([A-Za-z]+).’, expand=False)
pd.crosstab(train_df[‘Title’], train_df[‘Sex’])
可以將一些name進行合並成新的name,組成新特征
for dataset in combine:
dataset[‘Title’] = dataset[‘Title’].replace([‘Lady’, ‘Countess’,’Capt’, ‘Col’,\
‘Don’, ‘Dr’, ‘Major’, ‘Rev’, ‘Sir’, ‘Jonkheer’, ‘Dona’], ‘Rare’)
replace來替換-999這個值可能是一個表示缺失數據的標記值
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()
一次性替換多個值,則傳入一個由待替換值組成的列表以及替換值:data.replace([-999, -1000], np.nan)
對不同的值進行不同的替換,則傳入一個替換關系組成的列表:data.replace([-999, -1000], [np.nan, 0])
傳入的參數也可以是字典:data.replace({-999: np.nan, -1000: 0})
定義一個map函數,將字符型特征映射為數字型特征
fillna是填充缺失值
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()
3.轉換字符型特征為數字型,使用map函數
4.填充缺失值
用cut將數據划分為各個面元bin
pd.qcut()將數據分為若干份,對應新的一列,元素為一個范圍字符串,仍然需要量化
train_df[‘AgeBand’] = pd.cut(train_df[‘Age’], 5)
train_df[[‘AgeBand’, ‘Survived’]].groupby([‘AgeBand’],as_index=False).mean().sort_values(by=’AgeBand’, ascending=True)
將age范圍轉換為數字型特征
for dataset in combine:
dataset.loc[ dataset[‘Age’] <= 16, ‘Age’] = 0
dataset.loc[(dataset[‘Age’] > 16) & (dataset[‘Age’] <= 32), ‘Age’] = 1
dataset.loc[(dataset[‘Age’] > 32) & (dataset[‘Age’] <= 48), ‘Age’] = 2
dataset.loc[(dataset[‘Age’] > 48) & (dataset[‘Age’] <= 64), ‘Age’] = 3
dataset.loc[ dataset[‘Age’] > 64, ‘Age’]
train_df.head()
5.組合舊特征創建新特征
組合sibsp和parch為familysize
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)
根據familysize可以創建新特征isalone
for dataset in combine:
dataset[‘IsAlone’] = 0
dataset.loc[dataset[‘FamilySize’] == 1, ‘IsAlone’] = 1
使用dropna()函數來刪除具有空數據的行或列
freq_port = train_df.Embarked.dropna().mode()[0]對於一列非數字,例如字符,要找到出現頻率最高的字符賦值給missing值
我們對缺失值處理一般采用平均值填充(Mean/Mode Completer)
將信息表中的屬性分為數值屬性和非數值屬性來分別進行處理。如果空值是數值型的,就根據該屬性在其他所有對象的取值的平均值來填充該缺失的屬性值;如果空值是非數值型的,就根據統計學中的眾數原理,用該屬性在其他所有對象的取值次數最多的值(即出現頻率最高的值)來補齊該缺失的屬性值。
模型預測,解決問題
常用模型:
Logistic Regression
Support Vector Machine
Naive Bayes classifier
Decision Tree
GBDT
Random Forest
xgboost
可以使用LR來驗證我們的觀察和假設
coeff_df = pd.DataFrame(train_df.columns.delete(0)) 刪除第一列整型索引
coeff_df.columns = [‘Feature’] 增加新列
coeff_df[“Correlation”] = pd.Series(logreg.coef_[0])
coeff_df.sort_values(by=’Correlation’, ascending=False)
以下是一些可以嘗試的優化模型的方法:
加入交互項(interaction)
減少特征變量
正則化(regularization)
使用非線性模型