人工智慧 (01) 資料預處理

Jason990420發表於2019-12-18

檔案建立日期: 2019/12/18
最後修訂日期: None
相關軟體資訊:

Win 10 Python 3.7.2 Numpy 1.17.3 sklearn 0.21.3

參考檔案: AI with Python Tutorial

說明: 所有內容歡迎引用, 只需註明來源及作者, 本文內容如有錯誤或用詞不當, 敬請指正.

標題: 人工智慧 (01) 資料預處理

人工智慧 ( AI, Artificial Intelligence ) 我將它分為三大部份來說明 - 輸入, 處理, 輸出, , 這部份只談輸入部分中的資料預處理.

輸入分為兩部份 - 資料探勘, 資料預處理

資料探勘所取得的當然是原始資料, 這裡就不加討論說明. 原始資料會有各種不同的型別及範圍. 在進行人工智慧處理之前, 原始資料應該要預先處理或轉換成人工智慧處理及可以接受的格式.

資料預處理

  1. 原始資料可以分成各種不同的特性, 可能還有結論或結果.
  2. 這些特性要轉換成計算器可以接受的資料格式, 基本上就是數值或字串.
  3. 資料以2D方式來表示, 每一個陣列的元素是一個所有按順序排放的特性陣列.
  4. 將原始資料轉換成0 ~ 1 的範圍內, 因為在後面的計算中, 作乘法時, 資料還是會集中在0 ~ 1 的範圍內, 不會因為越乘越大, 而造成計算的溢位 (Overflow) 錯誤.
  5. 轉換的方式, 通常是在各特性中按某種比例縮放.
  6. 平均值與標準偏差 (σ) - 標準差定義為方差開算術平方根,反映組內個體間的離散程度。

常見預處理的方法

  1. 二元化轉換 - 將資料轉換成只有0和1的資料, 一般以一個臨界值作判斷.
  2. 縮放比轉換 - 按大小比例轉換到0和1之間的資料.
  3. 標準化轉換 - 計算平均值及標準偏差, 再以資料減去平均值再除以標準偏差.
  4. 正則化轉換 - 將每一筆資料的絶對值N次方, 除以其絶對值N次方的總和.
  5. 缺失值轉換 - 使用不完整資料集的基本策略是丟棄包含缺失值的整個行或列。 但是,這是以丟失有價值的資料為代價的(即使資料不完整)。 更好的策略是從資料的已知部分推斷出缺失值。

Python程式碼供參考

# -----------------------------------------------------------------------------
# Data Preparation
# -----------------------------------------------------------------------------

import numpy as np

def average(array):
    # 平均值 = 元素總和 / 元素數目
    result = 0
    for i in range(len(array)):
        result += array[i]
    result /= len(array)
    return result

def deviation(array, avg):
    # 標準偏差 = 開根號(總和((元素 - 平均值)^2)
    result = 0
    for i in range(len(array)):
        difference = array[i] - avg
        result += difference * difference
    result /= len(array)
    result = np.sqrt(result)
    return result

# -----------------------------------------------------------------------------
# 自己計算平均值及標準偏差
# -----------------------------------------------------------------------------

X = np.array([[1,2,3,4], [5,6,7,8], [9, 10, 11,12]])
mean = np.array([average  (X[:, i]) for i in range(X.shape[1])])
std  = np.array([deviation(X[:, i], mean[i]) for i in range(X.shape[1])])

# 與numpy提供的平均值及標準偏差方法, 比較計算結果為相同
print('result_mean == a.mean(axis=0): ', mean == X.mean(axis=0))
print('result_std  == a.std (axis=0): ', std  == X.std (axis=0))

# -----------------------------------------------------------------------------
# 基本資料
# -----------------------------------------------------------------------------

from sklearn import preprocessing

# 輸入資料 - 4筆資料, 每一筆資料有三個特性
data_input = np.array([[ 2.1, -1.9,  5.5], [-1.5,  2.4,  3.5],
                       [ 0.5, -7.9,  5.6], [ 5.9,  2.3, -5.8]])
mean = data_input.mean(axis=0)
deviation = data_input.std(axis=0)

# -----------------------------------------------------------------------------
# 二元化 - 建立Binarizer二元轉換器, 按臨界值為分界, 小於等於為0, 大於為1
# -----------------------------------------------------------------------------

Converter_Binary = preprocessing.Binarizer(threshold=mean)
data_binarized = Converter_Binary.transform(data_input)

# -----------------------------------------------------------------------------
# 縮放比 - 建立MinMaxScaler縮放器, 將每個特性按比例縮放的值到(0,1)之間
# -----------------------------------------------------------------------------

scaler = preprocessing.MinMaxScaler(feature_range=(0,1))
data_scaled_minmax = scaler.fit_transform(data_input)

# -----------------------------------------------------------------------------
# 標準化 - 按每個特性的平均值及方差計算 X_scale = (X - mean) / std
# -----------------------------------------------------------------------------

data_scaled = preprocessing.scale(data_input)

# -----------------------------------------------------------------------------
# 正則化 L1
# L1 正則化 / Least Absolute Deviations 結果中每一筆資料的絶值總和為1
# abs(data_normalized_l1).sum(axis=1) => array([1., 1., 1., 1.,])
# -----------------------------------------------------------------------------

data_normalized_l1 = preprocessing.normalize(data_input, norm='l1')

# -----------------------------------------------------------------------------
# 正則化 L2
# L2 正則化 / least squares 結果中的每一筆資料的平方總和為1
# np.square(data_normalized_l2).sum(axis=1) => array([1., 1., 1., 1.,])
# -----------------------------------------------------------------------------

data_normalized_l2 = preprocessing.normalize(data_input, norm='l2')

# -----------------------------------------------------------------------------
# 字串類轉換
# -----------------------------------------------------------------------------

data_input_labels = ['red','black','red','green','black','yellow','white']
encoder = preprocessing.LabelEncoder()
encoder.fit(data_input_labels)
data_test_labels = ['green','red','black']
encoded_values = encoder.transform(data_test_labels)
decoded_list = encoder.inverse_transform(encoded_values)

# -----------------------------------------------------------------------------
# 缺失值轉換
# -----------------------------------------------------------------------------

from sklearn import impute
imp = impute.SimpleImputer(missing_values=np.nan, strategy='mean')
imp.fit([[1, 2], [np.nan, 3], [7, 6]])
X = [[np.nan, 2], [6, np.nan], [7, 6]]
X_imputed = imp.transform(X)
本作品採用《CC 協議》,轉載必須註明作者和本文連結
Jason Yang

相關文章