android 檢視大圖_開源 | 新一代Android 效能監控框架Rabbit
1. 資料預處理的目的
1)去除無效資料、不規範資料、錯誤資料
2)補齊缺失值
3)對資料範圍、量綱、格式、型別進行統一化處理,更容易進行後續計算
2. 預處理方法
1)標準化(均值移除)
讓樣本矩陣中的每一列的平均值為0,標準差為1. 如有三個數a, b, c,則平均值為:
m
=
(
a
+
b
+
c
)
/
3
a
′
=
a
−
m
b
′
=
b
−
m
c
′
=
c
−
m
m = (a + b + c) / 3 \\ a' = a - m \\ b' = b - m \\ c' = c - m
m=(a+b+c)/3a′=a−mb′
預處理後的平均值為0:
(
a
′
+
b
′
+
c
′
)
/
3
=
(
(
a
+
b
+
c
)
−
3
m
)
/
3
=
0
(a' + b' + c') / 3 =( (a + b + c) - 3m) / 3 = 0
(a′+b′+c′)/3=((a+b+c)−3m)/3=0
預處理後的標準差:
s
=
s
q
r
t
(
(
(
a
−
m
)
2
+
(
b
−
m
)
2
+
(
c
−
m
)
2
)
/
3
)
s = sqrt(((a - m)^2 + (b - m)^2 + (c - m)^2)/3)
s=sqrt(((a−m)2+(b−m)2+(c−m)2
a ′ ′ = a / s a'' = a / s a′′=a/s
b ′ ′ = b / s b'' = b / s b′′=b/s
c ′ ′ = c / s c'' = c / s c′′=c/s
s ′ ′ = s q r t ( ( ( a ′ / s ) 2 + ( b ′ / s ) 2 + ( c ′ / s ) 2 ) / 3 ) s'' = sqrt(((a' / s)^2 + (b' / s) ^ 2 + (c' / s) ^ 2) / 3) s′′=sqrt(((a′/s)2+(b′/s)2+(c′/s)2)/3)
KaTeX parse error: Double superscript at position 11: =sqrt((a' ^̲ 2 + b' ^ 2 + c…
= 1 =1 =1
標準差:又稱均方差,是離均差平方的算術平均數的平方根,用σ表示 ,標準差能反映一個數據集的離散程度
程式碼示例:
# 資料預處理之:均值移除示例
import numpy as np
import sklearn.preprocessing as sp
# 樣本資料
raw_samples = np.array([
[3.0, -1.0, 2.0],
[0.0, 4.0, 3.0],
[1.0, -4.0, 2.0]
])
print(raw_samples)
print(raw_samples.mean(axis=0)) # 求每列的平均值
print(raw_samples.std(axis=0)) # 求每列標準差
std_samples = raw_samples.copy() # 複製樣本資料
for col in std_samples.T: # 遍歷每列
col_mean = col.mean() # 計算平均數
col_std = col.std() # 求標準差
col -= col_mean # 減平均值
col /= col_std # 除標準差
print(std_samples)
print(std_samples.mean(axis=0))
print(std_samples.std(axis=0))
我們也可以通過sklearn提供sp.scale函式實現同樣的功能,如下面程式碼所示:
std_samples = sp.scale(raw_samples) # 求標準移除
print(std_samples)
print(std_samples.mean(axis=0))
print(std_samples.std(axis=0))
2)範圍縮放
將樣本矩陣中的每一列最小值和最大值設定為相同的區間,統一各特徵值的範圍.如有a, b, c三個數,其中b為最小值,c為最大值,則:
a
′
=
a
−
b
a' = a - b
a′=a−b
b ′ = b − b b' = b - b b′=b−b
c ′ = c − b c' = c - b c′=c−b
縮放計算方式如下公式所示:
a ′ ′ = a ′ / c ′ a'' = a' / c' a′′=a′/c′
b ′ ′ = b ′ / c ′ b'' = b' / c' b′′=b′/c′
c ′ ′ = c ′ / c ′ c'' = c' / c' c′′=c′/c′
計算完成後,最小值為0,最大值為1.以下是一個範圍縮放的示例.
# 資料預處理之:範圍縮放
import numpy as np
import sklearn.preprocessing as sp
# 樣本資料
raw_samples = np.array([
[1.0, 2.0, 3.0],
[4.0, 5.0, 6.0],
[7.0, 8.0, 9.0]]).astype("float64")
# print(raw_samples)
mms_samples = raw_samples.copy() # 複製樣本資料
for col in mms_samples.T:
col_min = col.min()
col_max = col.max()
col -= col_min
col /= (col_max - col_min)
print(mms_samples)
我們也可以通過sklearn提供的物件實現同樣的功能,如下面程式碼所示:
# 根據給定範圍建立一個範圍縮放器物件
mms = sp.MinMaxScaler(feature_range=(0, 1))# 定義物件(修改範圍觀察現象)
# 使用範圍縮放器實現特徵值範圍縮放
mms_samples = mms.fit_transform(raw_samples) # 縮放
print(mms_samples)
執行結果:
[[0. 0. 0. ]
[0.5 0.5 0.5]
[1. 1. 1. ]]
[[0. 0. 0. ]
[0.5 0.5 0.5]
[1. 1. 1. ]]
3)歸一化
反映樣本所佔比率.用每個樣本的每個特徵值,除以該樣本各個特徵值絕對值之和.變換後的樣本矩陣,每個樣本的特徵值絕對值之和為1.例如如下反映程式語言熱度的樣本中,2018年也2017年比較,Python開發人員數量減少了2萬,但是所佔比率確上升了:
年份 | Python(萬人) | Java(萬人) | PHP(萬人) |
---|---|---|---|
2017 | 10 | 20 | 5 |
2018 | 8 | 10 | 1 |
歸一化預處理示例程式碼如下所示:
# 資料預處理之:歸一化
import numpy as np
import sklearn.preprocessing as sp
# 樣本資料
raw_samples = np.array([
[10.0, 20.0, 5.0],
[8.0, 10.0, 1.0]
])
print(raw_samples)
nor_samples = raw_samples.copy() # 複製樣本資料
for row in nor_samples:
row /= abs(row).sum() # 先對行求絕對值,再求和,再除以絕對值之和
print(nor_samples) # 列印結果
在sklearn庫中,可以呼叫sp.normalize()函式進行歸一化處理,函式原型為:
sp.normalize(原始樣本, norm='l2')
# l1: l1範數,除以向量中各元素絕對值之和
# l2: l2範數,除以向量中各元素平方之和
使用sklearn庫中歸一化處理程式碼如下所指示:
nor_samples = sp.normalize(raw_samples, norm='l1')
print(nor_samples) # 列印結果
4)二值化
根據一個事先給定的閾值,用0和1來表示特徵值是否超過閾值.以下是實現二值化預處理的程式碼:
# 二值化
import numpy as np
import sklearn.preprocessing as sp
raw_samples = np.array([[65.5, 89.0, 73.0],
[55.0, 99.0, 98.5],
[45.0, 22.5, 60.0]])
bin_samples = raw_samples.copy() # 複製陣列
# 生成掩碼陣列
mask1 = bin_samples < 60
mask2 = bin_samples >= 60
# 通過掩碼進行二值化處理
bin_samples[mask1] = 0
bin_samples[mask2] = 1
print(bin_samples) # 列印結果
同樣,也可以利用sklearn庫來處理:
bin = sp.Binarizer(threshold=61) # 建立二值化物件(注意邊界值)
bin_samples = bin.transform(raw_samples) # 二值化預處理
print(bin_samples)
二值化編碼會導致資訊損失,是不可逆的數值轉換.如果進行可逆轉換,則需要用到獨熱編碼.
5)獨熱編碼
根據一個特徵中值的個數來建立一個由一個1和若干個0組成的序列,用來序列對所有的特徵值進行編碼.例如有如下樣本:
[
1
3
2
7
5
4
1
8
6
7
3
9
]
\left[ \begin{matrix} 1 & 3 & 2\\ 7 & 5 & 4\\ 1 & 8 & 6\\ 7 & 3 & 9\\ \end{matrix} \right]
⎣⎢⎢⎡171735832469⎦⎥⎥⎤
對於第一列,有兩個值,1使用10編碼,7使用01編碼
對於第二列,有三個值,3使用100編碼,5使用010編碼,8使用001編碼
對於第三列,有四個值,2使用1000編碼,4使用0100編碼,6使用0010編碼,9使用0001編碼
編碼欄位,根據特徵值的個數來進行編碼,通過位置加以區分.通過獨熱編碼後的結果為:
$$
\left[
\begin{matrix}
10 & 100 & 1000\\
01 & 010 & 0100\\
10 & 001 & 0010\\
01 & 100 & 0001\\
\end{matrix}
\right]
$$
使用sklearn庫提供的功能進行獨熱編碼的程式碼如下所示:
# 獨熱編碼示例
import numpy as np
import sklearn.preprocessing as sp
raw_samples = np.array([[1, 3, 2],
[7, 5, 4],
[1, 8, 6],
[7, 3, 9]])
one_hot_encoder = sp.OneHotEncoder(
sparse=False, # 是否採用稀疏格式
dtype="int32",
categories="auto")# 自動編碼
oh_samples = one_hot_encoder.fit_transform(raw_samples) # 執行獨熱編碼
print(oh_samples)
print(one_hot_encoder.inverse_transform(oh_samples)) # 解碼
執行結果:
[[1 0 1 0 0 1 0 0 0]
[0 1 0 1 0 0 1 0 0]
[1 0 0 0 1 0 0 1 0]
[0 1 1 0 0 0 0 0 1]]
[[1 3 2]
[7 5 4]
[1 8 6]
[7 3 9]]
6)標籤編碼
根據字串形式的特徵值在特徵序列中的位置,來為其指定一個數字標籤,用於提供給基於數值演算法的學習模型.程式碼如下所示:
# 標籤編碼
import numpy as np
import sklearn.preprocessing as sp
raw_samples = np.array(['audi', 'ford', 'audi',
'bmw','ford', 'bmw'])
lb_encoder = sp.LabelEncoder() # 定義標籤編碼物件
lb_samples = lb_encoder.fit_transform(raw_samples) # 執行標籤編碼
print(lb_samples)
print(lb_encoder.inverse_transform(lb_samples)) # 逆向轉換
執行結果:
[0 2 0 1 2 1]
['audi' 'ford' 'audi' 'bmw' 'ford' 'bmw']