數據預處理 | 使用 Pandas 進行數值型數據的 標准化 歸一化 離散化 二值化


 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM