數據預處理


下面是我看到的一些數據處理以及訓練的方法,主要是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) 
使用非線性模型


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM