檔案建立日期: 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 ) 我將它分為三大部份來說明 - 輸入, 處理, 輸出, , 這部份只談輸入部分中的資料預處理.
輸入分為兩部份 - 資料探勘, 資料預處理
資料探勘所取得的當然是原始資料, 這裡就不加討論說明. 原始資料會有各種不同的型別及範圍. 在進行人工智慧處理之前, 原始資料應該要預先處理或轉換成人工智慧處理及可以接受的格式.
資料預處理
- 原始資料可以分成各種不同的特性, 可能還有結論或結果.
- 這些特性要轉換成計算器可以接受的資料格式, 基本上就是數值或字串.
- 資料以2D方式來表示, 每一個陣列的元素是一個所有按順序排放的特性陣列.
- 將原始資料轉換成0 ~ 1 的範圍內, 因為在後面的計算中, 作乘法時, 資料還是會集中在0 ~ 1 的範圍內, 不會因為越乘越大, 而造成計算的溢位 (Overflow) 錯誤.
- 轉換的方式, 通常是在各特性中按某種比例縮放.
- 平均值與標準偏差 (σ) - 標準差定義為方差開算術平方根,反映組內個體間的離散程度。
常見預處理的方法
- 二元化轉換 - 將資料轉換成只有0和1的資料, 一般以一個臨界值作判斷.
- 縮放比轉換 - 按大小比例轉換到0和1之間的資料.
- 標準化轉換 - 計算平均值及標準偏差, 再以資料減去平均值再除以標準偏差.
- 正則化轉換 - 將每一筆資料的絶對值N次方, 除以其絶對值N次方的總和.
- 缺失值轉換 - 使用不完整資料集的基本策略是丟棄包含缺失值的整個行或列。 但是,這是以丟失有價值的資料為代價的(即使資料不完整)。 更好的策略是從資料的已知部分推斷出缺失值。
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 協議》,轉載必須註明作者和本文連結