0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

數(shù)據(jù)預處理和特征工程的常用功能

新機器視覺 ? 來源:DA隨想隨筆 ? 2024-01-25 11:26 ? 次閱讀

來源:DA隨想隨筆

一、 概述

機器學習最基礎的5個流程,分別是數(shù)據(jù)獲取,數(shù)據(jù)預處理,特征工程,建模、測試和預測,上線與部署。

如果用做菜來對比,數(shù)據(jù)獲取就好比買菜,數(shù)據(jù)預處理就好比洗菜,特征工程就好比主菜輔料加工準備,建模就好比炒菜,上線部署就好比擺盤上菜。

由此可見,數(shù)據(jù)預處理和特征工程在整個機器學習應用工作中,占據(jù)了極其重要的地位。要是菜沒洗干凈,食材沒加工好,大廚手藝再高也做不出好吃的菜。

數(shù)據(jù)預處理

數(shù)據(jù)預處理主要是從數(shù)據(jù)角度和業(yè)務角度兩方面入手,從獲取的數(shù)據(jù)中查缺補漏,修正不準確的數(shù)據(jù),剔除不適用的數(shù)據(jù)。

數(shù)據(jù)預處理的主要目的就是讓數(shù)據(jù)符合模型需求,能正確表達業(yè)務意義。

常見的需要處理的問題有:

數(shù)據(jù)類型問題:數(shù)據(jù)中有的是文本格式,有的是數(shù)值格式,有的同樣是時間序列但是格式不同。

數(shù)據(jù)質量問題:數(shù)據(jù)存在重復值,異常值,缺失值,數(shù)據(jù)量綱不統(tǒng)一有的數(shù)據(jù)取值在(0,1)之間有的取值是百萬級的,樣本分布存在偏態(tài)有某幾類樣本量極大。

業(yè)務表達問題:有些數(shù)據(jù)從值上看符合一般邏輯,但是落在具體業(yè)務場景中,就會存在問題,因此要結合業(yè)務意義,剔除不符合要求的樣本數(shù)據(jù)。

特征工程

特征工程主要是對原始數(shù)據(jù)進行加工、組合、轉換、產生新的變量,使其更能代表預測模型的潛在問題。同時還可以通過特征工程,挑選和提取一些更有價值的特征,剔除一些對模型性能影響不大的特征,從而降低模型計算的復雜度。

特征工程的主要目的是降低模型計算成本,提高模型精度。

常見的需要處理的問題有:

相關性分析:特征與特征之間相關性強,說明具有多重共線性,可以將幾個特征組合成一個新特征,實現(xiàn)降維;特征與目標之間的相關性強,說明特征對目標的解釋性好,是可用的特征,反之,說明特征對目標沒什么影響,則可以剔除該特征。

特征構造:基于原始特征,進行組合,轉換,加工,生成新的特征,使得其更具有對目標的解釋性。

特征降維:講一些解釋性弱的特征,業(yè)務意義不強的特征剔除,降低模型運算復雜度,提高性能。

二、 常用功能

接下來以python為例,介紹在數(shù)據(jù)預處理和特征工程過程中常用的一些方法。

# 導入數(shù)據(jù),這里以python自帶的鳶尾花數(shù)據(jù)為例
from sklearn import datasets
import pandas as pd  
import numpy as np
# 加載數(shù)據(jù)集
data = datasets.load_iris()
X = data.data   # 特征值
y = data.target   # 目標值
data_iris=pd.DataFrame(X)
data_iris['target']=pd.DataFrame(y)
data_iris=data_iris.rename(columns={0:'F1',1:'F2',2:'F3',3:'F4','target':'target'})
data_iris.head()

數(shù)據(jù)預處理

重復值處理

# 重復值刪除
data_iris = data_iris.drop_duplicates()

缺失值處理

# 缺失值處理
## 查看缺失值
data_iris.isnull().sum()
## 缺失值刪除
### 刪除含有缺失值的行  
data_iris = data_iris.dropna()  


### 刪除含有缺失值的列  
data_iris = data_iris.dropna(axis=1)


##缺失值填補
### 用指定數(shù)值填充缺失值 ,如0
data_iris = data_iris.fillna(0)
### 用均值、中位數(shù)、眾數(shù)填補
data_iris = data_iris.fillna(data_iris.mean())

異常值處理

# 異常值識別
## 分位數(shù)識別異常值,將上下四分位數(shù)之外的都定義為異常值


from scipy import stats  


### 計算IQR  
Q1 = data_iris.quantile(0.25)  
Q3 = data_iris.quantile(0.75)  
IQR = Q3 - Q1  


### 找出異常值  
lower_bound = Q1 - 1.5 * IQR  
upper_bound = Q3 + 1.5 * IQR  
outliers = data_iris[(data_iris < lower_bound) | (data_iris > upper_bound)]


## 標準差識別異常值,在幾個標準差之外的數(shù)據(jù)定義為異常值 
z_scores = (data_iris - data_iris.mean()) / data_iris.std()  
outliers_z = z_scores[abs(z_scores) > 3]


# 異常值處理
# 異常值處理方式很多,如直接刪除或用均值替代等,其與缺失值處理方式基本一致,就不再額外贅述。

分類變量編碼

讓不可計算的分類變量轉化為可計算的數(shù)值或者矩陣

# label編碼,將分類變量轉化成數(shù)值形式
from sklearn.preprocessing import LabelEncoder
data_iris.iloc[:,-1] = LabelEncoder().fit_transform(data_iris.iloc[:,-1])
# onehot編碼,創(chuàng)建虛擬變量,將分類變量轉化成01矩陣
from sklearn.preprocessing import OneHotEncoder
X = data_iris.iloc[:,1:-1]
enc = OneHotEncoder(categories='auto').fit(X)
result = enc.transform(X).toarray()

連續(xù)變量編碼

將連續(xù)變量離散化,使得其可以根據(jù)有區(qū)分效果。

# 二值化,大于閾值記為1,小于閾值記為0
from sklearn.preprocessing import Binarizer
X = data_iris.iloc[:,0].values.reshape(-1,1)               #類為特征專用,所以不能使用一維數(shù)組
transformer = Binarizer(threshold=30).fit_transform(X)
#transformer
# 分箱
from sklearn.preprocessing import KBinsDiscretizer
X = data_iris.iloc[:,0].values.reshape(-1,1) 
# n_bins設置要分幾箱,默認為5;encode設置編碼方式,默認onehot;
# strategy設置分箱方法,默認為quantile等位分箱(每箱樣本數(shù)量相同),uniform等寬分箱,每個箱的上下限差值相同,kmeans聚類分箱
est = KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='uniform')
est.fit_transform(X)
#查看轉換后分的箱:變成了一列中的三箱
set(est.fit_transform(X).ravel())
est = KBinsDiscretizer(n_bins=3, encode='onehot', strategy='uniform')#查看轉換后分的箱:變成了啞變量
est.fit_transform(X).toarray()

標準化

消除變量的量綱,使得特征變量的值都收斂于同一個范圍。

# maxmin標準化
from sklearn.preprocessing import MinMaxScaler
#實現(xiàn)歸一化
scaler = MinMaxScaler()                             
scaler = scaler.fit(data_iris)                           
result = scaler.transform(data_iris)                     


# z標準化
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()                           
scaler = scaler.fit(data_iris) 
result = scaler.transform(data_iris)

特征工程

業(yè)務理解

通過數(shù)據(jù)預處理,數(shù)據(jù)邏輯上的錯誤基本已經消除。但這是否就代表著可以建模了呢?當然不是,這里還需要對特征進行處理。

如果說數(shù)據(jù)預處理是對行數(shù)據(jù)進行操作,那么特征工程主要是對列進行操作。

而這其中,最重要的一步,是對特征的業(yè)務理解。如,某一個數(shù)據(jù)集有幾列分別為地區(qū),天氣,降水量,空氣濕度,用戶年齡。

如果現(xiàn)在是要對天氣情況進行分析,那么很明顯,用戶年齡這個特征字段對這個目標是沒有用處的。因此從業(yè)務理解的角度考慮,首先就可以剔除一些沒有錯,但沒有用的特征變量。

特征選擇-過濾法

# 方差過濾
## 如果一個特征的方差很小,說明數(shù)據(jù)都集中于一個范圍中,沒有什么差異性,甚至都是相同的值,該特征用處就不大
from sklearn.feature_selection import VarianceThreshold
#獲取刪除不合格特征之后的新特征矩陣
X = VairanceThreshold().fit_transform(data_iris) 
# 相關性過濾
## 如果特征與標簽之間沒有相關性,則可以剔除該特征,如果特征與特征之間相關性很強,則可以將特征組合,實現(xiàn)降維
## 這里以卡方過濾為例,常見的還有F檢驗,互信息等
from sklearn.ensemble import RandomForestClassifier as RFC
from sklearn.model_selection import cross_val_score
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
# k表示需要保留的特征個數(shù)
X_kafang = SelectKBest(chi2, k=3).fit_transform(data_iris.iloc[:,:-1], data_iris['target'])
## 至于k怎么取值,一方面是可以根據(jù)業(yè)務實際需要取,也可以通過學習曲線取學習曲線中最高點對應的k值
%matplotlib inline
import matplotlib.pyplot as plt
score = []
for i in range(3,0,-1):
    X_fschi = SelectKBest(chi2, k=i).fit_transform(data_iris.iloc[:,:-1], data_iris['target'])
    once = cross_val_score(RFC(n_estimators=10,random_state=0),X_fschi,data_iris['target'],cv=5).mean()
    score.append(once)
plt.plot(range(3,0,-1),score)
plt.show()

特征選擇-嵌入法

將特征嵌入模型,讓算法同時進行特征選擇和模型訓練,然后輸出特征的權重參數(shù)值,通過排序選擇有用的特征,這里沒有一個統(tǒng)一的標準去判斷權重參數(shù)達到什么標準可以剔除。且不同算法對參數(shù)讀取的函數(shù)也略有不同,因此對本方法就不具體舉例了。

特征選擇-包裝法

通過引入一個函數(shù),來幫助算法在模型訓練時自主選擇特征,不需要人工判斷參數(shù)值。該方法相對復雜,本文也不做舉例。

三、 總結

本文簡單介紹了數(shù)據(jù)分析過程中,數(shù)據(jù)預處理和特征工程的相關基礎內容,并進行了一些舉例。但其實這兩部分內容遠不是這么簡單,在實際操作中,所遇到的問題更加復雜,且可應用的方法也非常多,本文所介紹的都是最基礎的方法,便于理解其用途。

可以說數(shù)據(jù)分析結果好不好,很大程度取決于數(shù)據(jù)預處理和特征工程做的好不好。本文相對粗淺,感興趣的朋友,可以再深入研究。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴

原文標題:算法基礎-數(shù)據(jù)預處理和特征工程

文章出處:【微信號:vision263com,微信公眾號:新機器視覺】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    轉:Keil的使用方法 - 常用功能(二)

    的鏈接(微信點擊閱讀原文),Keil使用方法(匯總):http://blog.csdn.net/ybhuangfugui/article/details/51647893 今天總結關于工程目標(配置)選項的常用功能,不會總結每一個功能
    發(fā)表于 06-13 10:42

    請問預處理有哪些常用功能分別如何使用?

    預處理有哪些常用功能,分別如何使用? 溫馨提示: 請從以下鏈接中的帖子學習相關內容并進行回答,其他地方得到的答案不能作為標準答案,僅能做為補充說明,七天之內答案不可見,答題的童鞋有七天時間修改
    發(fā)表于 05-21 09:17

    Python數(shù)據(jù)預處理方法

    機器學習-Python實踐Day3(特征工程--數(shù)據(jù)預處理2)
    發(fā)表于 06-03 15:55

    數(shù)據(jù)探索與數(shù)據(jù)預處理

    目錄1數(shù)據(jù)探索與數(shù)據(jù)預處理21.1 賽題回顧21.2 數(shù)據(jù)探索性分析與異常值處理21.3 相關性分析52
    發(fā)表于 07-12 08:37

    c語言預處理命令以什么開頭

    全面了吧。#define和#include是最常用預處理,單片機程序不用其他預處理也完全可行。所以初學者并不深究預處理的應用。我也只是初學者而已,但是發(fā)現(xiàn)
    發(fā)表于 07-20 07:00

    數(shù)據(jù)預處理故障信息獲取

    數(shù)據(jù)預處理故障信息獲取1.目前,常用的故障診斷參數(shù)有電流、電壓、功率、轉矩、磁通、溫度、振動等物理量。其中定子電流信號相對于其它參數(shù)受環(huán)境等外界影響最小,也因為電流傳感器安裝方便而最容易獲取,因此
    發(fā)表于 09-06 08:43

    工業(yè)蒸汽量預測的數(shù)據(jù)預處理知識有哪些

    工業(yè)蒸汽量預測的數(shù)據(jù)預處理知識有哪些?工業(yè)蒸汽量預測的特征工程有哪些?
    發(fā)表于 10-22 06:32

    變頻器的常用功能

    變頻器的常用功能
    發(fā)表于 08-23 10:48 ?86次下載

    AltiumDesigner設計常用功能鍵大全

    Altium Designer 設計常用功能鍵大全
    發(fā)表于 07-03 15:19 ?0次下載

    Keil的使用方法 - 常用功能(二)

    Keil的使用方法 - 常用功能(二)
    的頭像 發(fā)表于 04-07 14:55 ?3322次閱讀
    Keil的使用方法 -  <b class='flag-5'>常用功能</b>(二)

    Keil的使用方法 - 常用功能(一)

    Keil的使用方法 - 常用功能(一)
    的頭像 發(fā)表于 04-07 14:51 ?8829次閱讀
    Keil的使用方法 -  <b class='flag-5'>常用功能</b>(一)

    機器學習的特征預處理問題討論

    本文我們來討論特征預處理的相關問題。主要包括特征的歸一化和標準化,異常特征樣本清洗與樣本數(shù)據(jù)不平衡問題的
    的頭像 發(fā)表于 03-15 17:14 ?908次閱讀

    allegro常用功能介紹

    allegro常用功能介紹
    發(fā)表于 01-10 11:53 ?0次下載

    特征工程數(shù)據(jù)預處理全解析:基礎技術和代碼示例

    在機器學習和數(shù)據(jù)科學的世界里,數(shù)據(jù)的質量是建模成功與否的關鍵所在。這就是特征工程數(shù)據(jù)預處理發(fā)揮
    的頭像 發(fā)表于 06-26 08:28 ?488次閱讀
    <b class='flag-5'>特征</b><b class='flag-5'>工程</b>與<b class='flag-5'>數(shù)據(jù)</b><b class='flag-5'>預處理</b>全解析:基礎技術和代碼示例

    機器學習中的數(shù)據(jù)預處理特征工程

    在機器學習的整個流程中,數(shù)據(jù)預處理特征工程是兩個至關重要的步驟。它們直接決定了模型的輸入質量,進而影響模型的訓練效果和泛化能力。本文將從數(shù)據(jù)
    的頭像 發(fā)表于 07-09 15:57 ?421次閱讀