使用pandas模塊實現數據的標準化操作
如下所示:
3σ 原則 | (u-3*σ ,u+3*σ ) |
離差標準化 | (x-min)/(max-min) |
標準差標準化 | (x-u)/σ |
小數定標標準化 |
x/10**k k=np.ceil(log10(max(|x|))) |
1.3σ原則
u 均值
σ 標準差
正太分佈的數據基本都分佈在(u-3σ,u+3σ)范圍內
其他的數據
import pandas as pd import numpy as np def three_sigma(se): """ 自實現3σ原則,進行數據過濾 :param se:傳進來的series結構數據 :return:去除異常值之後的series數據 """ bool_id=((se.mean()-3*se.std())<se) & (se<(se.mean()+3*se.std())) print(bool_id) return se[bool_id] #加載數據 detail=pd.read_excel('./meal_order_detail.xlsx') #進行異常值處理 res=three_sigma(detail['amounts']) print(detail.shape) print(res.shape)
2.離差標準化
(x-min)/(max-min)
import pandas as pd import numpy as np def minmax_sca(data): """ 離差標準化 param data:傳入的數據 return:標準化之後的數據 """ new_data=(data-data.min())/(data.max()-data.min()) return new_data #加載數據 detail=pd.read_excel('./meal_order_detail.xlsx') res=minmax_sca(detail[['amounts','counts']]) print(res) data=res bool_id=data.loc[:,'count']==1 print(data.loc[bool_id],'counts')
3.標準差標準化
(x-u)/σ
異常值對標準差標準化的影響不大
轉化之後的數據—>均值0 標準差1
import pandas as pd import numpy as np def stand_sca(data): """ 標準差標準化 :param data:傳入的數據 :return:標準化之後的數據 """ new_data=(data-data.mean())/data.std() return new_data #加載數據 detail=pd.read_excel('./meal_order_detail.xlsx') res=stand_sca(detail[['amounts','counts']]) print(res) print('res的均值:',res.mean()) print('res的標準差:',res.std())
4.小數定標標準化
x/(10^k) k=math.ceil(log10(max(|x|)))
以10為底,x的絕對值的最大值的對數 最後進行向上取整
import pandas as pd import numpy as np def deci_sca(data): """ 自實現小數定標標準化 :param data: 傳入的數據 :return: 標準化之後的數據 """ new_data=data/(10**(np.ceil(np.log10(data.abs().max())))) return new_data #加載數據 detail = pd.read_excel('./meal_order_detail.xlsx') res = deci_sca(detail[['amounts', 'counts']]) print(res)
補充:pandas數據處理基礎之標準化與標簽數值化
fit(): Method calculates the parameters μ and σ and saves them as internal objects.
解釋:簡單來說,就是求得訓練集X的均值,方差,最大值,最小值,這些訓練集X固有的屬性。
transform(): Method using these calculated parameters apply the transformation to a particular dataset.
解釋:在fit的基礎上,進行標準化,降維,歸一化等操作(看具體用的是哪個工具,如PCA,StandardScaler等)。
fit_transform(): joins the fit() and transform() method for transformation of dataset.
解釋:fit_transform是fit和transform的組合,既包括瞭訓練又包含瞭轉換。 transform()和fit_transform()二者的功能都是對數據進行某種統一處理(比如標準化~N(0,1),將數據縮放(映射)到某個固定區間,歸一化,正則化等)
fit_transform(trainData)對部分數據先擬合fit,找到該part的整體指標,如均值、方差、最大值最小值等等(根據具體轉換的目的),然後對該trainData進行轉換transform,從而實現數據的標準化、歸一化等等。
Note:
必須先用fit_transform(trainData),之後再transform(testData)
如果直接transform(testData),程序會報錯
如果fit_transfrom(trainData)後,使用fit_transform(testData)而不transform(testData),雖然也能歸一化,但是兩個結果不是在同一個“標準”下的,具有明顯差異。(一定要避免這種情況)
註意:StandardScaler().fit_transform(x,fit_params),fit_params決定標準化的標簽數據,就是每個標準化的標桿數據,此參數不同,則每次標準化的過程則不同。
from sklearn import preprocessing # 獲取數據 cols = ['OverallQual','GrLivArea', 'GarageCars','TotalBsmtSF', 'FullBath', 'TotRmsAbvGrd', 'YearBuilt'] ##選取列 x = data_train[cols].values y = data_train['SalePrice'].values x_scaled = preprocessing.StandardScaler().fit_transform(x) ##進行歸一化 y_scaled = preprocessing.StandardScaler().fit_transform(y.reshape(-1,1))##先將y轉換成一列,再進行歸一
還有以下形式,和上面的標準化原理一致,都是先fit,再transform。
由ss決定標準化進程的獨特性
# 先將數據標準化 from sklearn.preprocessing import StandardScaler ss = StandardScaler() ## #用測試集訓練並標準化 ss.fit(missing_age_X_train)##首先fit missing_age_X_train = ss.transform(missing_age_X_train) #進行transform missing_age_X_test = ss.transform(missing_age_X_test)
標簽數值化
1.當某列數據不是數值型數據時,將難以標準化,此時要將數據轉化成數據型形式。
數據處理前數據顯示:
經過標簽化數據處理
from sklearn import preprocessing f_names = ['CentralAir', 'Neighborhood'] ##需要處理的數據標簽 for x in f_names: label = preprocessing.LabelEncoder() data_train[x] = label.fit_transform(data_train[x]) ##數據標準化
處理之後變成:
2.當某列有對應的標簽值時,即某個量對應相應確定的標簽時,例如oldtown就對應1,sawyer就對應2,分類的str轉換為序列類這時使用如下:
數據處理之前
利用轉換:
title_mapping = {"Mr": 1, "Miss": 2, "Mrs": 3, "Master": 4, "Rare": 5}#將標簽對應數值 train_df['Title'] = train_df['Title'].map(title_mapping)#處理數據 train_df['Title'] = train_df['Title'].fillna(0)##將其餘標簽填充為0值
處理過後:
3.多個數據標簽需要分列采用one_hot形式時,處理之前
處理之後
train_test.loc[train_test["Age"].isnull() ,"age_nan"] = 1 ##將標簽轉換成1 train_test.loc[train_test["Age"].notnull() ,"age_nan"] = 0##將此標簽成為0 train_test = pd.get_dummies(train_test,columns=['age_nan']) ##columns決定哪幾行分列處理,prefix參數是每列前綴
one_hot 形式轉變成功。
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- python的numpy模塊實現邏輯回歸模型
- python利用pandas分析學生期末成績實例代碼
- python機器學習基礎線性回歸與嶺回歸算法詳解
- python pandas處理excel表格數據的常用方法總結
- python讀寫excel數據–pandas詳解