文章目錄
- 一、概述
-
- 1.1資料預處理和特征工程
- 1.2sklearn中資料預處理和特征工程
- 二、資料預處理
-
- 2.1資料無量綱化
- 2.2缺失值
一、概述
1.1資料預處理和特征工程
1、資料挖掘五大流程:
- 擷取資料
-
資料預處理
(1)定義:資料預處理是從資料中檢測,糾正或删除損壞,不準确或不适用于模型的記錄的過程
(2)可能面對的問題有:資料類型不同,比如有的是文字,有的是數字,有的含時間序列,有的連續,有的間斷。也可能,資料的品質不行,有噪聲,有異常,有缺失,資料出錯,量綱不一,有重複,資料是偏态,資料量太大或太小
(3)資料預處理的目的:讓資料适應模型,比對模型的需求
-
特征工程:
(1)定義:特征工程是将原始資料轉換為更能代表預測模型的潛在問題的特征的過程,可以通過挑選最相關的特征,提取特征以及創造特征來實作。其中創造特征又經常以降維算法的方式實作。
(2)可能面對的問題有:特征之間有相關性,特征和标簽無關,特征太多或太小,或者幹脆就無法表現出應有的資料現象或無法展示資料的真實面貌
(3)特征工程的目的:降低計算成本,提升模型上限
- 模組化,測試模型并預測出結果
- 上線,驗證模型效果
1.2sklearn中資料預處理和特征工程
- 子產品preprocessing:幾乎包含資料預處理的所有内容
- 子產品Impute:填補缺失值專用
- 子產品feature_selection:包含特征選擇的各種方法的實踐
- 子產品decomposition:包含降維算法
二、資料預處理
2.1資料無量綱化
1、定義:我們往往有着将不同規格的資料轉換到同一規格,或不同分布的資料轉換到某個特定分布
的需求,這種需求統稱為将資料“無量綱化”。
注意:樹的算法不需要無量綱化,樹可以将任意資料處理的非常好。
2、分類:線性和非線性。
線性的無量綱化包括中心化和縮放處理。
- 中心化的本質是讓所有記錄減去一個固定值,即讓資料樣本資料平移到某個位置。
- 縮放的本質是通過除以一個固定值,将資料固定在某個範圍之中,取對數也算是一種縮放處理。
3、sklearn中的函數
(1)preprocessing.MinMaxScaler
- 定義:當資料(x)按照最小值中心化後,再按極差(最大值 - 最小值)縮放,資料移動了最小值個機關,并且會被收斂到[0,1]之間,而這個過程,就叫做資料歸一化。
- 在sklearn當中,我們使用preprocessing.MinMaxScaler來實作這個功能。MinMaxScaler有一個重要參數,feature_range,控制我們希望把資料壓縮到的範圍,預設是[0,1]。
from sklearn.preprocessing import MinMaxScaler
import pandas as pd
data=[[-1,2],
[-0.5,6]
,[0,10]
,[1,18]]
pd.DataFrame(data)
#歸一化1
scaler=MinMaxScaler()#執行個體化
scaler=scaler.fit(data)#生成min(x)和max(x)
result=scaler.transform(data)#通過接口導出結果
print(result)
result_=scaler.fit_transform(data)#一步達成
scaler.inverse_transform(result)#将歸一化的結果逆轉
#歸一化2
scaler1=MinMaxScaler(feature_range=[5,10])
result1=scaler1.fit_transform(data)
print(result1)
(2)preprocessing.StandardScaler
- 當資料(x)按均值(μ)中心化後,再按标準差(σ)縮放,資料就會服從為均值為0,方差為1的正态分布(即标準正态分布),而這個過程,就叫做資料标準化
#标準化
from sklearn.preprocessing import StandardScaler
data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]
scaler = StandardScaler() #執行個體化
scaler.fit(data) #fit,本質是生成均值和方差
scaler.mean_ #檢視均值的屬性mean_
scaler.var_ #檢視方差的屬性var_
x_std = scaler.transform(data) #通過接口導出結果
x_std.mean() #導出的結果是一個數組,用mean()檢視均值
x_std.std() #用std()檢視方差
scaler.fit_transform(data) #使用fit_transform(data)一步達成結果
scaler.inverse_transform(x_std) #使用inverse_transform逆轉标準化
(3)如何選擇标準化和歸一化
标準化:在PCA,聚類,邏輯回歸,支援向量機,神經網絡。
歸一化:對異常值敏感,數字圖像進行中量化像素強度
(4)其他資料無量綱方法
2.2缺失值
在這裡我們使用titanic的部分資料進行。
1、讀入資料
import pandas as pd
data=pd.read_csv("E:/21國賽/Titannic/Narrativedata.csv",index_col=0)
data.info()
data.head()
年齡和艙門具有缺失值。
2、填補缺失值:impute.SimpleImputer
(1)格式:
class sklearn.impute.SimpleImputer (missing_values=nan, strategy=’mean’, fill_value=None, verbose=0,
copy=True)
(2)參數
參數 | 含義 |
---|---|
missing_values | 告訴SimpleImputer,資料中的缺失值長什麼樣,預設空值np.nan |
strategy | 我們填補缺失值的政策,預設均值。輸入“mean”使用均值填補(僅對數值型特征可用;輸入“median"用中值填補(僅對數值型特征可用;輸入"most_frequent”用衆數填補(對數值型和字元型特征都可用);輸入“constant"表示請參考參數“fill_value"中的值(對數值型和字元型特征都可用 |
fill_value | 當參數startegy為”constant"的時候可用,可輸入字元串或數字表示要填充的值,常用0 |
copy | 預設為True,将建立特征矩陣的副本,反之則會将缺失值填補到原本的特征矩陣中去。 |
#填補年齡
Age=data.loc[:,"Age"].values.reshape(-1,1)
#print(Age[:20])
imp_mean=SimpleImputer()#均值
imp_median=SimpleImputer(strategy='median')#中位數
imp_0=SimpleImputer(strategy='constant',fill_value=0)#0
imp_mean=imp_mean.fit_transform(Age)
imp_median=imp_median.fit_transform(Age)
imp_0=imp_0.fit_transform(Age)
data.loc[:,"Age"]=imp_median
data.info()
輸出結果:
同理對Embarked進行填補
Embarked=data.loc[:,"Embarked"].values.reshape(-1,1)
imp_mode=SimpleImputer(strategy='most_frequent')
imp_mode=imp_mode.fit_transform(Embarked)
data.loc[:,"Embarked"]=imp_mode
data.info()
輸出結果:
3、處理分類特征:編碼和啞變量
編碼:将文字型資料轉換為數值型。
preprocessing.LabelEncoder:标簽專用,能夠将分類轉換為分類數值
#分類變量
y=data.iloc[:,-1]
le=LabelEncoder()
le=le.fit(y)#導入資料
label=le.transform(y)
le.classes_
label
#le.fit_transform(y) 一步到位
data.iloc[:,-1] = label
輸出結果
preprocessing.OrdinalEncoder:特征專用,能夠将分類特征轉換為分類數值
#分類變量:專為特征分類
from sklearn.preprocessing import OrdinalEncoder
data_=data.copy()
data_.head()
OrdinalEncoder().fit(data_.iloc[:,1:-1]).categories_
data_.iloc[:,1:-1]=OrdinalEncoder().fit_transform(data_.iloc[:,1:-1])
print(data_.head())
preprocessing.OneHotEncoder:獨熱編碼,建立啞變量。
三種分類資料:
- 三種取值S,C,Q是互相獨立的,彼此之間完全沒有聯系,表達的是S≠C≠Q的概念。這是名義變量
- 三種取值不是完全獨立的,舉例:在性質上可以有高中>國中>國小這樣的聯系,學曆有高低,但是學曆取值之間卻不是可以計算的,我們不能說國小 + 某個取值 = 國中。這是有序變量
-
各個取值之間有聯系,且是可以互相計算的,比如體重(>45kg,>90kg,>135kg),其中120kg - 45kg = 90kg,分類之間可以通過數學計算互相轉換。這是有距變量
對于名義變量我們需要使用啞變量進行變換。
#獨熱編碼
from sklearn.preprocessing import OneHotEncoder
X=data.iloc[:,1:-1]
enc=OneHotEncoder(categories='auto').fit(X)
result=enc.transform(X).toarray()
#print(result)
print(enc.get_feature_names())
#合并
newdata=pd.concat([data,pd.DataFrame(result)],axis=1)
print(newdata.head())
newdata.drop(["Sex","Embarked"],axis=1,inplace=True)
newdata.columns=["Age","Survived","Female","Male","Embarked_C","Embarked_Q","Embarked_S"]
print(newdata.head())
輸出結果:
總結: