所謂凡事預則立,不預則廢。資料預處理過程是乙個資料分析的基礎,資料預處理主要分成三大部分:
結合課上的理論部分,筆者結合sklearn機器學習庫中的一些常用的預處理過程**,予以說明。
針對不同的資料,特徵提取方法差異較大,這裡不做統一說明,之後如果遇到會單獨介紹。
在第一章中介紹了若干資料型別,大部分資料都是異構的,即會有多種資料型別並存,為了便於處理,有必要對不同的資料型別進行統一,使之可以使用同一套處理辦法。
類別型轉化為數值型
文字轉化為數值型
這裡做一點拓展,主要是結合了自然語言處理課上的東西。建立乙個單詞數量為v的詞表,每一篇文件都用乙個長度為v的向量表示,向量的每乙個維度上代表了詞表中的乙個單詞。
時間序列轉化為離散序列
基於數值的平均化
使用等深間隔,取平均值。
注意這裡有乙個問題,由於資料形式是乙個序列,因此如何確保等深是乙個難題,因為處理當前資料是無法知道後續資料的情況的,所以很難保證資料平均劃分到區間中。因此此時需要假設資料服從某種概率分布,或者事先進行進行分布估計。
時間序列轉化為數值型
#encoding=utf-8
from sklearn import preprocessing
import numpy as np
# 構造的資料集
data = np.array([["a","b","c"],["c","a","r"],["k","b","f"]])
# 將字元型類別變數轉化為數值編碼
enc1 = preprocessing.labelencoder()
code =
for i in range(data.shape[0]):
enc1.fit(data[:,i])
code = np.array(code).transpose()
print code
# 結果 [[0 1 0] [1 0 2] [2 1 1]]
# 數值編碼轉化為one-hot編碼
enc2 = preprocessing.onehotencoder()
enc2.fit(code)
bincode = enc2.transform(code)
print bincode.toarray()
#結果 [[ 1. 0. 0. 0. 1. 1. 0. 0.] [ 0. 1. 0. 1. 0. 0. 0. 1.] [ 0. 0. 1. 0. 1. 0. 1. 0.]]
注意labelencoder是針對一列資料,也就是乙個屬性進行編碼的,而onehotencoder是可以將整個資料集傳入然後進行轉換,轉換的結果是乙個稀疏矩陣,使用toarray方法可以展開成標準的形式。
有時候資料給出的時候並不是完整的,有些資料是缺失的,還有的是明顯錯誤的資料,需要在前期進行必要的篩選。
pandas庫是專門處理資料的乙個python第三方庫,基於numpy,可以與sklearn和numpy以及scipy無縫連線。文末給出乙個pandas的鏈結,基本可以滿足常見的資料清理要求。
去除明顯錯誤的資料沒有一定之法,需要的是根據實際情況來進行判斷。比如年齡的範圍一般都在0-200之間,小於0或者大於200的數值都是異常的。
還有些需要使用一些異常檢測的演算法來去除離群點,這些異常值很難用經驗判斷出來,屬於資料的雜訊,後續會有專門關於異常檢測的一節。
假設一組資料集中,有乙個屬性的取值範圍一般都在1000-2000之間,另外乙個屬性的取值範圍一般在0-1之間,這兩個屬性直接參與後續的建模運算,顯然第乙個特徵會對最後結果有更大的影響,即使可以通過學習演算法的權重的自動調整機制減輕這種影響,但是也會減緩演算法的收斂速度。因此,將不同特徵的資料一視同仁地對待,就需要尺度變換和歸一化操作。
常見的變換操作有中心化和最大值最小值變換。
標準化公式為:
z=x−
μσ中心化公式為: z=
x−mi
nmax
−min
sklearn中也已經整合好了這兩個函式,可以直接呼叫。當然了,自己寫的話也沒什麼難度。
下面給出三種常見的sklearn呼叫,分別是標準化、中心化和絕對值中心化
import numpy as np
from sklearn import preprocessing
data = np.array([[1,101,1999],[0.5,231,2871],[0.3,98,2110]])
normalizer = preprocessing.normalizer()
normalizer.fit(data)
print normalizer.transform(data)
scaler1 = preprocessing.minmaxscaler()
scaler1.fit(data)
print scaler1.transform(data)
scaler2 = preprocessing.maxabsscaler()
scaler2.fit(data)
print scaler2.transform(data)
有一篇很好地部落格總結了sklearn中的預處理模組,文末已經給出了相關鏈結。
資料縮減優點可以提高空間和時間效率,但是會損失部分資訊,實際應用在需要對兩方面進行權衡。
有偏取樣
某些資料會被著重強調,比如時間序列中距離當前點越近的資料,應該考慮的權重就應該越大。
分層取樣
先把資料分成幾個層,在每個層中分別進行取樣,這樣做主要是避免樣本類別不均衡的情況出現。
流資料取樣
流資料由於源源不斷,因此如何均勻地進行取樣就是個問題,原因如前所述,我們無法看到資料的全貌,因為資料一直在產生。
演算法:流資料中均勻取樣k個資料
記錄最先到達的前
k 個資料
將第n個資料以概率k/
n加入到取樣集合中
加入操作後,等概率捨棄原有的某乙個資料
可以證明,這樣的取樣辦法保證每個資料點的被取樣的概率均為k/
n ,正面過程在問候的鏈結裡給出。
特徵選擇(後面會有專門介紹)
one-hot編碼例項介紹
labelencoder sklearn文件
sklearn preprocessing模組基本功能介紹
流資料取樣演算法證明
十分鐘搞定pandas
資料探勘系列之二 資料探勘概述
資料庫系統經歷了如下的技術演變 資料收集和資料庫建立,資料管理 dbms,包括資料儲存和檢索,聯機事務處理oltp 以及高階資料分析 涉及資料倉儲和資料探勘 當前常見的資料集形式為多個異構資料來源在單個站點以統一的模式組織的儲存庫,即資料倉儲。資料倉儲技術包括資料清理 資料整合和聯機分析處理olap...
資料探勘系列之二 資料探勘概述
資料庫系統經歷了如下的技術演變 資料收集和資料庫建立,資料管理 dbms,包括資料儲存和檢索,聯機事務處理oltp 以及高階資料分析 涉及資料倉儲和資料探勘 當前常見的資料集形式為多個異構資料來源在單個站點以統一的模式組織的儲存庫,即資料倉儲。資料倉儲技術包括資料清理 資料整合和聯機分析處理olap...
資料探勘筆記(二)
資料探勘常用的方法 利用資料探勘進行資料分析常用的方法主要有分類 回歸分析 聚類 關聯規則 特徵 變化和偏差分析 web頁挖掘等,它們分別從不同的角度對資料進行挖掘。分類。分類是找出資料庫中一組資料物件的共同特點並按照分類模式將其劃分為不同的類,其目的是通過分類模型,將資料庫中的資料項對映到某個給定...