1. 程式人生 > >不忘初心,方得始終。

不忘初心,方得始終。

資料預處理有四個任務,資料清洗、資料整合、資料 變換和資料規約。

一、資料清洗

1.缺失值處理
處理缺失值分為三類:刪除記錄、資料補差和不處理。
資料補插方法:
1. 補插均值/中位數/眾數
2. 使用固定值
3. 最近鄰補插
4. 迴歸方法
5. 插值法
插值法介紹:
(1)拉格朗日插值法
python 的Scipy庫提供
程式碼:

#coding=utf-8
import pandas as pd #匯入資料分析庫Pandas
from scipy.interpolate import lagrange #匯入拉格朗日插值函式

inputfile = 'data/catering_sale.xls'
#銷量資料路徑 outputfile = 'tmp/sales.xls' #輸出資料路徑 data = pd.read_excel(inputfile) #讀入資料 #過濾異常值,將其變為空值 row_indexs = (data[u'銷量'] < 400) | (data[u'銷量'] > 5000) #得到過濾資料的索引 data.loc[row_indexs,u'銷量'] = None #過濾資料 #自定義列向量插值函式 #s為列向量,n為被插值的位置,k為取前後的資料個數,預設為5 def ployinterp_column(s, n, k=5): y = s[list(range(n-k, n)) + list(range(n+1
, n+1+k))] #取數 y = y[y.notnull()] #剔除空值 return lagrange(y.index, list(y))(n) #插值並返回插值結果 #逐個元素判斷是否需要插值 for i in data.columns: for j in range(len(data)): if (data[i].isnull())[j]: #如果為空即插值。 data[i][j] = ployinterp_column(data[i], j) data.to_excel(outputfile) #輸出結果,寫入檔案

插入值為:
這裡寫圖片描述
(2)牛頓插值法
需要另寫,具有承襲性和易於變動節點的特點
(3)Hermite插值
(4)分段插值
(5)樣條插值

2.異常值處理
(1)刪除有異常值的記錄
(2)視為缺失值
(3)平均值修正
(4)不處理
要分析異常值的原因,再決定取捨。

二、資料整合

將多個數據源放在一個統一的資料倉庫中。
1.實體識別
同名異義
異名同義
單位不統一
2.冗餘屬性識別
同一屬性多次出現
同一屬性命名不一致

三、資料變換

對資料進行規範化處理
1.簡單函式變換
原始資料進行數學函式變換,平方、開方、取對數、差分運算。用來將不具有正太分佈的資料變換成具有正太性的資料。
時間序列分析中,對數變換或者差分運算可以將非平穩序列轉換為平穩序列。
2.規範化
消除指標間量綱影響
(1)最小-最大規範化
這裡寫圖片描述
這裡寫圖片描述
(2)零-均值規範化
這裡寫圖片描述
這裡寫圖片描述
(3)小數定標規範化
這裡寫圖片描述
這裡寫圖片描述

程式碼:

-*- coding: utf-8 -*-
#資料規範化
import pandas as pd
import numpy as np

datafile = 'data/normalization_data.xls' #引數初始化
data = pd.read_excel(datafile, header = None) #讀取資料

min=(data - data.min())/(data.max() - data.min()) #最小-最大規範化
zero=(data - data.mean())/data.std() #零-均值規範化
float=data/10**np.ceil(np.log10(data.abs().max())) #小數定標規範化
print "原始資料為:\n",data
print "最小-最大規範後為:\n",min
print "零-均值規範化後為:\n",zero
print "小數規範化後為:\n",float

執行結果:
這裡寫圖片描述
這裡寫圖片描述
3.連續屬性離散化
將連續屬性變為分類屬性,即連續屬性離散化。資料離散化本質上通過斷點集合將連續的屬性空間劃分為若干區,最後用不同的符號或者整數值代表落在每個子區間中的資料。離散化涉及兩個子任務:確定分類以及如何將連續屬性值對映到這些分類值。
(1)等寬法
(2)等頻法
(3)基於聚類分析的方法

程式碼:

#-*- coding: utf-8 -*-
#資料規範化
import pandas as pd

datafile = 'data/discretization_data.xls' #引數初始化
data = pd.read_excel(datafile) #讀取資料
data = data[u'肝氣鬱結證型係數'].copy()
k = 4

d1 = pd.cut(data, k, labels = range(k)) #等寬離散化,各個類比依次命名為0,1,2,3

#等頻率離散化
w = [1.0*i/k for i in range(k+1)]
w = data.describe(percentiles = w)[4:4+k+1] #使用describe函式自動計算分位數
w[0] = w[0]*(1-1e-10)
d2 = pd.cut(data, w, labels = range(k))

from sklearn.cluster import KMeans #引入KMeans
kmodel = KMeans(n_clusters = k, n_jobs = 4) #建立模型,n_jobs是並行數,一般等於CPU數較好
kmodel.fit(data.reshape((len(data), 1))) #訓練模型
c = pd.DataFrame(kmodel.cluster_centers_).sort(0) #輸出聚類中心,並且排序(預設是隨機序的)
w = pd.rolling_mean(c, 2).iloc[1:] #相鄰兩項求中點,作為邊界點
w = [0] + list(w[0]) + [data.max()] #把首末邊界點加上
d3 = pd.cut(data, w, labels = range(k))

def cluster_plot(d, k): #自定義作圖函式來顯示聚類結果
  import matplotlib.pyplot as plt
  plt.rcParams['font.sans-serif'] = ['SimHei'] #用來正常顯示中文標籤
  plt.rcParams['axes.unicode_minus'] = False #用來正常顯示負號

  plt.figure(figsize = (8, 3))
  for j in range(0, k):
    plt.plot(data[d==j], [j for i in d[d==j]], 'o')

  plt.ylim(-0.5, k-0.5)
  return plt

cluster_plot(d1, k).savefig("/home/python/syy/images/pic4_1.png")

cluster_plot(d2, k).savefig("/home/python/syy/images/pic4_2.png")
cluster_plot(d3, k).savefig("/home/python/syy/images/pic4_3.png")

執行結果:
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
4.屬性構造
利用已有的屬性構造新的屬性,並加到現有的屬性中。

程式碼:

#coding=utf-8
#-*- coding: utf-8 -*-
#線損率屬性構造
import pandas as pd

#引數初始化
datafile= 'data/electricity_data.xls' #供入供出電量資料
outputfile = 'tmp/electricity_data.xls' #屬性構造後資料檔案


data = pd.read_excel(datafile) #讀入資料
data[u'線損率'] = (data[u'供入電量'] - data[u'供出電量'])/data[u'供入電量']

data.to_excel(outputfile, index = False) #儲存結果

執行結果:
這裡寫圖片描述
5.小波變換
非平穩序列的分析手段。
基於小波變換的特徵提取方法:
(1)基於小波變換的多尺度空間能量分佈特徵提取法
(2)基於小波變換的多尺度空間的模極大特徵值提取法
(3)基於小波變換的特徵提取方法
(4)基於適應性小波神經網路的特徵提取方法

程式碼:

#-*- coding: utf-8 -*-
#利用小波分析進行特徵分析

#引數初始化
inputfile= 'data/leleccum.mat' #提取自Matlab的訊號檔案

from scipy.io import loadmat #mat是MATLAB專用格式,需要用loadmat讀取它
mat = loadmat(inputfile)
signal = mat['leleccum'][0]

import pywt #匯入PyWavelets
coeffs = pywt.wavedec(signal, 'bior3.7', level = 5)
#返回結果為level+1個數字,第一個陣列為逼近係數陣列,後面的依次是細節係數陣列

這裡寫圖片描述
………….

四、資料規約

降低無效,錯誤資料對建模的影響,提高建模的準確性。
少量且代表性的資料將大幅縮減資料探勘所需時間。
降低儲存資料成本。
1.屬性規約

  1. 合併屬性
  2. 逐步向前選擇
  3. 逐步向後刪除
  4. 決策樹歸納
  5. 主成分分析
    這裡寫圖片描述

這裡寫圖片描述

主成分降維程式碼:

import pandas as pd

#引數初始化
inputfile = 'data/principal_component.xls'
outputfile = 'tmp/dimention_reducted.xls' #降維後的資料

data = pd.read_excel(inputfile, header = None) #讀入資料

from sklearn.decomposition import PCA

pca = PCA()
pca.fit(data)
com=pca.components_ #返回模型的各個特徵向量
pca=pca.explained_variance_ratio_ #返回各個成分各自的方差百分比
print com,"百分比:\n",pca

執行結果:
[[ 0.56788461 0.2280431 0.23281436 0.22427336 0.3358618 0.43679539
0.03861081 0.46466998]
[ 0.64801531 0.24732373 -0.17085432 -0.2089819 -0.36050922 -0.55908747
0.00186891 0.05910423]
[-0.45139763 0.23802089 -0.17685792 -0.11843804 -0.05173347 -0.20091919
-0.00124421 0.80699041]
[-0.19404741 0.9021939 -0.00730164 -0.01424541 0.03106289 0.12563004
0.11152105 -0.3448924 ]
[-0.06133747 -0.03383817 0.12652433 0.64325682 -0.3896425 -0.10681901
0.63233277 0.04720838]
[ 0.02579655 -0.06678747 0.12816343 -0.57023937 -0.52642373 0.52280144
0.31167833 0.0754221 ]
[-0.03800378 0.09520111 0.15593386 0.34300352 -0.56640021 0.18985251
-0.69902952 0.04505823]
[-0.10147399 0.03937889 0.91023327 -0.18760016 0.06193777 -0.34598258
-0.02090066 0.02137393]]
百分比:
[ 7.74011263e-01 1.56949443e-01 4.27594216e-02 2.40659228e-02
1.50278048e-03 4.10990447e-04 2.07718405e-04 9.24594471e-05]
由此可見,選擇三維:

pca=PCA(3)
pca.fit(data)
low_d=pca.transform(data)#降維
pd.DataFrame(low_d).to_excel(outputfile)
pca.inverse_transform(low_d)

降維後的資料:
這裡寫圖片描述

2.數值規約
通過選擇替代的、較小的資料來減少資料量,包含有引數方法和無引數方法兩類;有引數方法使用模型評估資料,不需要存放真實資料,只需要存放參數,例如迴歸、對數線性模型。無引數需要資料,例如直方圖、聚類、抽樣。
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述

五、python中常用資料預處理函式

1.interpolate:一維,高維資料插值
f.scipy.interpolate.lagrange(x,y)
2.unique:去除重複元素
np.unique(D)
D.unique( )

import pandas as pd
import numpy as np
D=pd.Series([1,1,2,3,5])
d1=D.unique()
d2=np.unique(D)
print "d1 is:\n",d1
print "d2 is:\n",d2

d1 is: [1 2 3 5]
d2 is: [1 2 3 5]

3.isnull/notnull:判斷空值/非空值
4.random:生成隨機矩陣
k x m x n維0-1之間;
np.random.rand(k,m,n…)
k x m x n維,正態分佈;
np.random.randn(k,m,n)
5.PCA:主成分分析