1. 程式人生 > 其它 >android 檢視大圖_開源 | 新一代Android 效能監控框架Rabbit

android 檢視大圖_開源 | 新一代Android 效能監控框架Rabbit

技術標籤:資料處理python機器學習

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=amb

=bmc=cm
預處理後的平均值為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(((am)2+(bm)2+(cm)2
)/3)

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=ab

b ′ = b − b b' = b - b b=bb

c ′ = c − b c' = c - b c=cb

縮放計算方式如下公式所示:

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(萬人)
201710205
20188101

歸一化預處理示例程式碼如下所示:

# 資料預處理之:歸一化
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']