1 標准化 & 歸一化
導包和數據
import numpy as np from sklearn import preprocessing data = np.loadtxt('data.txt', delimiter='\t')
1.1 標准化 (Z-Score)
x'=(x-mean)/std 原轉換的數據為x,新數據為x′,mean和std為x所在列的均值和標准差
標准化之后的數據是以0為均值,方差為1的正態分布。
但是Z-Score方法是一種中心化方法,會改變原有數據的分布結構,不適合對稀疏數據做處理。
# 建立 StandardScaler 對象 z_scaler= preprocessing.StandardScaler() # 用 StandardScaler 對象對數據進行標准化處理 z_data = z_scaler.fit_transform(data)
1.2 歸一化(Max-Min)
x'=(x-min)/(max-min),min和max為x所在列的最小值和最大值
將數據規整到 [0,1] 區間內(Z-Score則沒有類似區間)
歸一化后的數據能較好地保持原有數據結構。
數據中有異常值時,受影響比較大
# 建立MinMaxScaler模型對象 m_scaler = preprocessing.MinMaxScaler() # 使用 MinMaxScaler 對象 對數據進行歸一化處理 m_data = m_scaler.fit_transform(data)
2 離散化 / 分箱 / 分桶
離散化,就是把無限空間中有限的個體映射到有限的空間中
導包和數據
import pandas as pd from sklearn.cluster import KMeans from sklearn import preprocessing df = pd.read_table('data1.txt', names=['id', 'amount', 'income', 'datetime', 'age'])
數據基本情況
2.1 針對時間數據的離散化
方法 1 :使用 pd.to_datetime 及 dt.dayofweek
# 將數據轉成 datetime 類型 df['datetime'] = pd.to_datetime(df['datetime']) # 顯示 周幾 df['dow'] = df['datetime'].dt.dayofweek
方法 2:純手工打造(可以忽略了)
# 將時間轉換為datetime格式,Python3中,map返回一個迭代器,所以需要list一下,把其中的值取出來 df['datetime'] = list(map(pd.to_datetime,df['datetime'])) # 離散化為 周幾 的格式 df['datetime']= [i.weekday() for i in df['datetime']]
2.2 針對連續數據的離散化
連續數據的離散化結果可以分為兩類:
一類是將連續數據划分為特定區間的集合,例如{(0,10],(10,20],(20,50],(50,100]}
一類是將連續數據划分為特定類,例如類1、類2、類3
常見實現針對連續數據化離散化的方法如下。
分位數法:使用四分位、五分位、十分位等分位數進行離散化處理
距離區間法:可使用等距區間或自定義區間的方式進行離散化,該方法(尤其是等距區間)可以較好地保持數據原有的分布
頻率區間法:將數據按照不同數據的頻率分布進行排序,然后按照等頻率或指定頻率離散化,這種方法會把數據變換成均勻分布。好處是各區間的觀察值是相同的,不足會改變了原有數據的分布狀態。每個桶里的數值個數是相同的
聚類法:例如使用 K 均值將樣本集分為多個離散化的簇
2.2.1 距離區間法:自定義分箱區間實現離散化
# 自定義區間邊界 bins = [0, 200, 1000, 5000, 10000] # 按照給定區間 使用 pd.cut 將數據進行離散化 df['amount_grp1'] = pd.cut(df['amount'], bins=bins)
附:實現離散化 並添加自定義標簽(另外一份數據中的)
bins = [0,2,10,300] labels = [ '<2', '<10','<300'] # right == False : 左閉右開,不加此項,默認為左開右閉的 df['price_level'] = pd.cut(df.price,bins=bins,labels=labels, right=False)
2.2.2 頻率區間法:按照等頻率或指定頻率離散化
df['amount3'] = pd.qcut(df['amount'], 4, labels=['bad', 'medium', 'good', 'awesome'])
2.2.3 聚類法實現離散化
1 # 獲取要聚類的數據 2 df_clu = df[['amount']] 3 4 # 創建 KMeans 模型並指定要聚類數量 5 model_kmeans = KMeans(n_clusters=4, random_state=111) 6 7 # 建模聚類 8 kmeans_result = model_kmeans.fit_predict(df_clu) 9 10 # 將新離散化的數據合並到原數據框 11 df['amount2'] = kmeans_result
對第 5 行代碼的補充:
創建KMeans模型並指定要聚類數量,分成4組
random_state 隨機數種子,指定之后,每次划分的訓練集測試集划分方式相同
如果指定的random_state相同,每次生成的隨機數都是一樣的
3 二值化
根據某一閾值,將數據分成兩類,得到一個只擁有兩個值域的二值化數據集
# 建立Binarizer模型對象,利用income這一列的平均值作為閾值,進行二值化 bi_scaler = preprocessing.Binarizer(threshold=df['income'].mean()) # Binarizer標准化轉換 bi_income = bi_scaler.fit_transform(df[['income']]) df['bi_income'] = bi_income