国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

數(shù)據(jù)處理方法整理【目前最全】

這篇具有很好參考價值的文章主要介紹了數(shù)據(jù)處理方法整理【目前最全】。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

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

主要采用編寫數(shù)據(jù)處理代碼來對數(shù)據(jù)進行處理步驟,主要采用Python語言,使用相關(guān)的Pandas、Numpy、Scikit-learn等庫來進行操作,一些代碼實例如下。

1、缺失數(shù)據(jù)處理

數(shù)據(jù)缺失是指數(shù)據(jù)集中某行記錄或某列特征的變量值存在空值的情況。常用的缺失值處理方法主要包括以下幾種:
(1)刪除法,若數(shù)據(jù)集中某行記錄或某一列特征的數(shù)據(jù)缺失比率大于指定閱值時,可以認為該行數(shù)據(jù)或該列特征為無效數(shù)據(jù)或無效特征,直接刪除含缺失數(shù)據(jù)的記錄即可。

# 參考代碼
# 缺失值進行判斷
df.isnull()
# 缺失值刪除
df.dropna(axis=0, how=‘a(chǎn)ny’, thresh=None, subset=None, inplace=False)
# pandas刪除全為0值的行
df.drop( index = df.age[df1.age == 0].index )
# 參數(shù):
# axis:軸。0或’index’,表示按行刪除;1或’columns’,表示按列刪除。
# how:篩選方式。‘a(chǎn)ny’,表示該行/列只要有一個以上的空值,就刪除該行/列;‘a(chǎn)ll’,表示該行/列全部都為空值,就刪除該行/列。
# thresh:非空元素最低數(shù)量。int型,默認為None。如果該行/列中,非空元素數(shù)量小于這個值,就刪除該行/列。
# subset:子集。列表,元素為行或者列的索引。如果axis=0或者‘index’,subset中元素為列的索引;如果axis=1或者‘column’,subset中元素為行的索引。由subset限制的子區(qū)域,是判斷是否刪除該行/列的條件判斷區(qū)域。
# inplace:是否原地替換。布爾值,默認為False。如果為True,則在原DataFrame上進行操作,返回值為None。

(2)基于統(tǒng)計學(xué)變量的填充法,這類方法需要根據(jù)特征的類型和分布情況決定采用哪種統(tǒng)計學(xué)變量進行填充。例如:特征是離散型的,可以直接通過眾數(shù)對缺失值進行填充;特征是連續(xù)數(shù)值型并且數(shù)據(jù)分布比較均勻,可以采用平均數(shù)對缺失值進行填充,用全局變量或是屬性的平均值來代替所有缺失數(shù)據(jù);特征是連續(xù)數(shù)值型但分布傾斜,可以采用中位數(shù)進行填充等。

# 參考代碼

# 方法一:直接用Pandas庫
# 均值填補數(shù)據(jù)
data['空缺值所在列名'] =  data['空缺值所在列名'].fillna(data['空缺值所在列名'].mean())
catering_sale = "catering_sale.xls" 
# 眾數(shù)填補數(shù)據(jù)
data['空缺值所在列名'] =  data['空缺值所在列名'].fillna(data['空缺值所在列名'].mode()[0])
catering_sale = "catering_sale.xls" 
# 中位數(shù)填補數(shù)據(jù)
data['空缺值所在列名'] =  data['空缺值所在列名'].fillna(data['空缺值所在列名'].median())
catering_sale = "catering_sale.xls" 
# 前一個數(shù)據(jù)填補數(shù)據(jù)
data['空缺值所在列名'] =  data['空缺值所在列名'].fillna(method='pad')
catering_sale = "catering_sale.xls" 
# 后一個數(shù)據(jù)填補數(shù)據(jù)
data['空缺值所在列名'] =  data['空缺值所在列名'].fillna(method='bfill')

# 方法二:計算平均值等,再進行填充
# 對‘column’列用平均值帶替代缺失值NaN計算平均值
c = avg = 0
for ele in df['column']:
    if str(ele).isnumeric():
        c += 1
        avg += ele
avg /= c
 
# 替換缺失值
df = df.replace(to_replace="NaN",
                value=avg)
 
# 展示數(shù)據(jù)
df

(3)基于插值的填充法,這類方法主要是通過隨機插值、拉格朗日插值、多項式插值等方法對缺失的變量值進行填充。例如:多項式插值法是通過構(gòu)建多項式來擬合現(xiàn)有的數(shù)據(jù),使得所有的樣本數(shù)據(jù)都符合該多項式的分布,需要獲取某個樣本的缺失值時,通過求解該多項式來獲得。

# 參考代碼

# 使用庫函數(shù)進行插值
# Scipy庫中的interp1d函數(shù)可以實現(xiàn)一維數(shù)據(jù)的插值,包括線性插值、多項式曲線插值和鄰近值插值。
# 定義x,y分別為數(shù)據(jù)的‘時間軸’和需要插補的‘列名’
x = data['time']
y = data['column']
# xnew構(gòu)建新的完整的時間序列 = [1,2,3,...23]
xnew = np.linspace(1,23,num=23)
# 線性插值
f1 = interp1d(x,y,kind='linear') # kind替換不同的種類用不同方法進行插值,多項式曲線插值-‘cubic’,鄰近值插值-‘nearest’
ynew1 = f1(xnew)

# 自定義函數(shù)進行插值
from scipy.interpolate import lagrange # 拉格朗日函數(shù)
data=pd.read_excel('data.xls')
# 自定義列向量插值函數(shù)
def ploy(s,n,k=6):
	y=s[list(range(n-k,n))+list(range(n+1,n+1+k))]#取數(shù)
	y=y[y.notnull()]
	return lagrange(y.index,list(y))(n)
for i in data.columns:
	for j in range(len(data)):
		if(data[i].isnull())[j]:
			data[i][j]=ploy(data[i],j)
data.to_excel('data_1.xls')

(4)基于模型的填充法,這類方法是利用有監(jiān)督的模型或者無監(jiān)督的模型來實現(xiàn)缺失值的填充。例如:K近鄰填充是利用聚類的方式來獲得某個缺失樣本鄰近的若干個樣本點,通過對這些樣本點計算均值或加權(quán)平均來進行缺失值填充。

# 參考代碼
# scikit-learn發(fā)布0.22版本中,新增的非常好用的缺失值插補方法:KNNImputer。基于KNN算法使得可以更便捷地處理缺失值,并且與直接用均值、中位數(shù)相比更為可靠。
from sklearn.impute import KNNImputer
# n_neighbors為選擇“鄰居”樣本的個數(shù),這里n_neighbors=2。
imputer = KNNImputer(n_neighbors=2)
imputer.fit_transform(data)

# IterativeImputer多變量缺失值填補-慮數(shù)據(jù)在高維空間中的整體分布情況,然后在對有缺失值的樣本進行填充。
# IterativeImputer多變量缺失值填補方法
iterimp = IterativeImputer(random_state = 123)
oceandfiter = iterimp.fit_transform(oceandf)
# 獲取填充后的變量-column為第5列
column = oceandfiter[:,4]

# MissForest缺失值填補-利用隨機森林的思想,進行缺失值填充
# MissForest缺失值填補方法
forestimp = MissForest(n_estimators = 100,random_state = 123)
oceandfforest = forestimp.fit_transform(oceandf)
# 獲取填充后的變量-column為第5列
column = oceandfforest[:,4]

(5)熱卡填充法,這類方法是在數(shù)據(jù)集中尋找與缺失樣本最相似的樣本點,并利用該最相似樣本的變量值對缺失數(shù)據(jù)進行填充。問題關(guān)鍵是不同的問題可能會選用不同的標準來對相似進行判定,以及如何制定這個判定標準。該方法概念上很簡單,且利用了數(shù)據(jù)間的關(guān)系來進行空值估計,但缺點在于難以定義相似標準,主觀因素較多。

# 參考代碼

def hot_deck_imputation(dataframe:pd.DataFrame):
	from sklearn.impute import KNNImputer 
	hot_deck_imputer = KNNlmputer(n_neighbors=2,weights="uniform")#雖然看著是用 KNN,但是參數(shù)固定:n neighbors=2
	new_df= hot_deck_imputer.fit_transform(dataframe)
	return new_df

(6)預(yù)測法,這類方法是用預(yù)測模型來預(yù)測每一個缺失數(shù)據(jù)。用已有數(shù)據(jù)作為訓(xùn)練樣本來建立預(yù)測模型,預(yù)測缺失數(shù)據(jù)。該方法最大限度地利用已知的相關(guān)數(shù)據(jù),是比較流行的缺失數(shù)據(jù)處理技術(shù)。

# 參考代碼

# 一些采用ML或DL方法進行預(yù)測來對缺失值進行插補,如RNN方法
# 南開大學(xué)Yonghong Luo等人提出的用GAN來進行時間序列插值的算法-算法框架(E2GAN)(文章發(fā)表于NIPS 2018 和IJCAI 2019)
1. Luo, Yonghong, et al. "Multivariate time series imputation with generative adversarial networks."Advances in Neural Information Processing Systems. 2018.
2. Luo, Yonghong, et al. "E 2 GAN: end-to-end generative adversarial network for multivariate time series imputation."Proceedings of the 28th International Joint Conference on Artificial Intelligence. AAAl Press, 2019.

2、數(shù)據(jù)重采樣

針對時序數(shù)據(jù)可采用數(shù)據(jù)重采樣方法,將時間序列從一個頻率轉(zhuǎn)換至另一個頻率的過程,它主要有兩種實現(xiàn)方式,分別是降采樣和升采樣,降采樣指將高頻率的數(shù)據(jù)轉(zhuǎn)換為低頻率,升采樣則與其恰好相反,將低頻率數(shù)據(jù)轉(zhuǎn)換到高頻率。

對于一些高密度傳感器,會在毫秒級別產(chǎn)生海量時序數(shù)據(jù),因此對此類大量數(shù)據(jù)進行采樣,將數(shù)據(jù)壓縮到秒、分鐘、小時等級別,來對數(shù)據(jù)進行壓縮,較少數(shù)據(jù)量。

可采用Pandas 提供的 resample() 函數(shù)來實現(xiàn)數(shù)據(jù)的重采樣。

# 參考代碼

DataFrame.resample(rule, on='索引列名', axis=0, fill_method=None, label='left', closed='left')
# on:可以指定某一列使用resample,例如:例如:resample(‘3D’, on=’交易日期’).sum()
# axis=0:默認是縱軸,橫軸設(shè)置axis=1
# fill_method = None:升采樣時如何插值,比如‘ffill’(向上采樣)、‘bfill’(向下采樣)等
# label= ‘right’:在降采樣時,如何設(shè)置聚合值的標簽,例如,9:30-9:35會被標記成9:30還是9:35,默認9:35
# closed = ‘right’:在降采樣時,各時間段的哪一段是閉合的,‘right’或‘left’,默認‘right’
# label=’left’, closed=’left’,建議統(tǒng)一設(shè)置成’left’
# rule的取值對應(yīng)如下:
B	工作日頻率
C	自定義工作日頻率
D	日歷日頻率
W	每周頻率
M	月末頻率
SM	半月末頻率(15日和月末)
BM	營業(yè)月末頻率
CBM	自定義業(yè)務(wù)月末頻率
MS	月初頻率
SMS	半個月開始頻率(第1次和第15次)
BMS	營業(yè)月開始頻率
CBMS	自定義營業(yè)月開始頻率
Q	四分之一端頻率
BQ	業(yè)務(wù)季度末頻率
QS	四分之一起始頻率
BQS	業(yè)務(wù)季度開始頻率
A	年終頻率
BA	營業(yè)年末頻率
AS	年份起始頻率
BAS	業(yè)務(wù)年度開始頻率
BH	營業(yè)時間頻率
H	每小時頻率
T	分鐘頻率
S	第二頻率
L	毫秒
U	微秒
N	納秒

data_h =data_index.resample('H').first()
data_h

3、離群值處理

當數(shù)據(jù)中的某個數(shù)據(jù)點明顯偏離于其他數(shù)據(jù)點的分布或者某個數(shù)據(jù)點明顯區(qū)別于其他的數(shù)據(jù)點時,將其判定為離群點(異常值),對離群值可采用異常數(shù)據(jù)檢測的方法,檢測異常值并將其進行去除。

異常數(shù)據(jù)檢測主要包括以下幾種方法:
(1)基于統(tǒng)計分析的方法,通過特征的描述信息以及特征值范圍來判斷數(shù)據(jù)是否異常。例如,對于年齡特征,規(guī)約其值的范圍是[0,200],當出現(xiàn)了負數(shù)或者大于200的數(shù),則判斷為異常數(shù)據(jù)。
(2)基于密度的方法,通過離群點的局部密度顯著低于大部分近鄰點的特點進行判定,適用于非均勻的數(shù)據(jù)集。
(3)基于聚類的方法,一般正常的數(shù)據(jù)點呈現(xiàn)“物以類聚”的聚合形態(tài),正常數(shù)據(jù)出現(xiàn)在密集的鄰域周圍,而異常點偏離較遠,以此來對數(shù)據(jù)進行判定異常。
(4)基于樹的方法,通過劃分來判定異常。如孤立森林(Isolation Forest,iForest)被認為是最有效的異常檢測方法之一,該方法是通過計算樣本點的異常關(guān)聯(lián)度分數(shù)來進行異常判定,若某樣本得到的異常關(guān)聯(lián)度分數(shù)較高,且大于閱值時可以判定其為異常。
(5)基于預(yù)測的方法,對時序數(shù)據(jù)根據(jù)其預(yù)測出來的時序曲線和真實的數(shù)據(jù)相比,來判定異常值的出現(xiàn)。

具體一些方法介紹如下:

(1) 基于統(tǒng)計分布的異常檢測

數(shù)據(jù)分布模型可以通過估計概率分布的參數(shù)來創(chuàng)建。如果一個對象不能很好地同該模型擬合,即如果它很可能不服從該分布,則它是一個異常。

3σ-法則

假設(shè)一組檢測數(shù)據(jù)只含有隨機誤差,對原始數(shù)據(jù)進行計算處理得到標準差,然后按一定的概率確定一個區(qū)間,認為誤差超過這個區(qū)間的就屬于異常值。

(μ?3σ,μ+3σ)區(qū)間內(nèi)的概率為99.74。所以可以認為,當數(shù)據(jù)分布區(qū)間超過這個區(qū)間時,即可認為是異常數(shù)據(jù)。

假設(shè)數(shù)據(jù)集由一個正太分布產(chǎn)生,該分布可以用 N(μ,σ) 表示,其中 μ 是序列的均值,σ是序列的標準差,數(shù)據(jù)落在 (μ-3σ,μ+3σ) 之外的概率僅有0.27%,落在 (μ-4σ,μ+4σ) 之外的區(qū)域的概率僅有0.01%,可以根據(jù)對業(yè)務(wù)的理解和時序曲線,找到合適的K值用來作為不同級別的異常報警。

# 參考代碼

#3-sigma識別異常值
def three_sigma(df_col): #df_col:DataFrame數(shù)據(jù)的某一列
    rule = (df_col.mean() - 3 * df_col.std() > df_col) | (df_col.mean() + 3 * df_col.std() < df_col)
    index = np.arange(df_col.shape[0])[rule]
    outrange = df_col.iloc[index]
    return outrange

# 另一種方式識別低值和高值
def three_sigma(s):
    mu, std = np.mean(s), np.std(s)
    lower, upper = mu-3*std, mu+3*std
    return lower, upper

Z-score

Z-score為標準分數(shù),測量數(shù)據(jù)點和平均值的距離,若A與平均值相差2個標準差,Z-score為2。當把Z-score=3作為閾值去剔除異常點時,便相當于3sigma。

# 參考代碼

def z_score(s):
  z_score = (s - np.mean(s)) / np.std(s)
  return z_score

MA滑動平均法

識別數(shù)據(jù)不規(guī)則性的最簡單的方法是標記偏離分布的數(shù)據(jù)點,包括平均值、中值、分位數(shù)和模式。
假定異常數(shù)據(jù)點是偏離平均值的某個標準偏差,那么我們可以計算時間序列數(shù)據(jù)滑動窗口下的局部平均值,通過平均值來確定偏離程度。這被技術(shù)稱為滑動平均法(moving average,MA),旨在平滑短期波動并突出長期波動。滑動平均還包括累加移動平均、加權(quán)移動平均、指數(shù)加權(quán)移動平均、雙指數(shù)平滑、三指數(shù)平滑等,在數(shù)學(xué)上,nn周期簡單移動平均也可以定義為“低通濾波器”。

該方法有明顯缺陷:數(shù)據(jù)中可能存在與異常行為類似的噪聲數(shù)據(jù),所以正常行為和異常行為之間的界限通常不明顯;異?;蛘5亩x可能經(jīng)常發(fā)生變化,基于移動平均值的閾值可能并不總是適用。

# 參考代碼

# 簡單移動平均線(Simple Moving Average,SMA)|加權(quán)移動平均(Weighted Moving Average,WMA)|指數(shù)加權(quán)移動平均(exponentially weighted moving average,EWMA)
# python pandas包中,對于ewma和sma有現(xiàn)成的實現(xiàn)方法,這里對于wma進行代碼的編寫處理
class WMA(object):
    """
    加權(quán)移動平均實現(xiàn)
    """
    def get_wma_weights(span, flag=True):
        """
        計算每個數(shù)值點的wma權(quán)重值
        """
        paras = range(1, span + 1)
        count = sum(paras)
        if flag:
            return [float(para) / count for para in paras]
        else:
            return [float(para) / count for para in paras][::-1]

    def get_wma_values(self, datas):
        """
        計算wma數(shù)值
        """
        wma_values = []
        wma_keys = datas.index
        for length in range(1, len(datas) + 1):
            wma_value = 0
            weights = self.get_wma_weights(length)
            for index, weight in zip(datas.index, weights):
                wma_value += datas[index] * weight
            wma_values.append(wma_value)
        return pd.Series(wma_values, wma_keys)
# 計算異常值
def calculate_variance(data, moving_average):
    variance = 0
    flag_list = moving_average.isnull()
    count = 0
    for index in range(len(data)):
        if flag_list[index]:
            count += 1
            continue
        variance += (data[index] - moving_average[index]) ** 2
    variance /= (len(data) - count)
    return variance
    
# ewma進行擬合
ewma_line = pd.ewma(data, span=4)
# 簡單移動平均
sma_line = pd.rolling_mean(data, window=4)
# wma加權(quán)移動平均
wma_line = WMA().get_wma_values(data)


sma_var = calculate_variance(data, sma_line)
wma_var = calculate_variance(data, wma_line)
ewma_var = calculate_variance(data, ewma_line)

boxplot箱型圖(分位數(shù)異常檢測)

箱型圖,是一種用作顯示一組數(shù)據(jù)分散情況資料的統(tǒng)計圖。主要用于反映原始數(shù)據(jù)分布的特征,還可以進行多組數(shù)據(jù)分布特征的比較,其繪制方法是:先找出一組數(shù)據(jù)的最大值、最小值、中位數(shù)和上下兩個四分位數(shù)。通過不同分位數(shù)來劃分異常值和疑似異常值。

IQR是第三四分位數(shù)減去第一四分位數(shù),大于Q3+1.5IQR之外的數(shù)和小于Q1-1.5*IQR的值被認為是異常值。

# 參考代碼

# 定義箱線圖識別異常值函數(shù)
def box_plot(Ser):
    '''
    Ser:進行異常值分析的DataFrame的某一列
    '''
    Low = Ser.quantile(0.25)-1.5*(Ser.quantile(0.75)-Ser.quantile(0.25))
    Up = Ser.quantile(0.75)+1.5*(Ser.quantile(0.75)-Ser.quantile(0.25))
    index = (Ser< Low) | (Ser>Up)
    Outlier = Ser.loc[index]
    return(Outlier)

box_plot(df['counts']).head(8)


# 另一種形式識別低值和高值
def boxplot(s):
    q1, q3 = s.quantile(.25), s.quantile(.75)
    iqr = q3 - q1
    lower, upper = q1 - 1.5*iqr, q3 + 1.5*iqr
    return lower, upper

Grubbs異常檢驗

Grubbs測試是一種從樣本中找出outlier的方法,所謂outlier,是指樣本中偏離平均值過遠的數(shù)據(jù),他們有可能是極端情況下的正常數(shù)據(jù),也有可能是測量過程中的錯誤數(shù)據(jù)。使用Grubbs測試需要總體是正態(tài)分布的。

算法流程:

①.樣本從小到大排序
②.求樣本的mean和std.dev [均值和標準差]
③.計算min/max與mean的差距,更大的那個為可疑值
④.求可疑值的z-score (standard score),如果大于Grubbs臨界值,那么就是outlier;
⑤.Grubbs臨界值可以查表得到[它由兩個值決定:檢出水平α(越嚴格越?。?、樣本數(shù)量n],排除outlier,對剩余序列循環(huán)做①-④步驟。
由于這里需要的是異常判定,只需要判斷tail_avg是否outlier即可。

# 參考代碼

# 使用grubbs對應(yīng)的庫直接調(diào)用
# 添加包 pip install outlier_utils==0.0.3
from outliers import smirnov_grubbs as grubbs
grubbs.test(data, alpha) # 默認雙邊檢驗
# https://github.com/c-bata/outlier-utils
(2) 基于密度的異常檢測

基于密度的異常檢測有一個先決條件,即正常的數(shù)據(jù)點呈現(xiàn)“物以類聚”的聚合形態(tài),正常數(shù)據(jù)出現(xiàn)在密集的鄰域周圍,而異常點偏離較遠。
對于這種場景,我們可以計算得分來評估最近的數(shù)據(jù)點集,這種得分可以使用Eucledian距離或其它的距離計算方法,具體情況需要根據(jù)數(shù)據(jù)類型來定:類別型或是數(shù)字型。

對象的密度估計(1)可以相對直接地計算,特別是當對象之間存在鄰近性度量時,低密度區(qū)域中的對象相對遠離近鄰,可能被看作異常。一種更復(fù)雜的方法考慮到(2)數(shù)據(jù)集可能有不同密度區(qū)域這一事實,僅當一個點的局部密度顯著地低于它的大部分近鄰時才將其分類為離群點。

  • 基于密度的異常分的計算公式:

density ? ( x , k ) = ( ∑ y ∈ N ( x , k ) distance ? ( x , y ) ∣ N ( x , k ) ∣ ) ? 1 \operatorname{density}(x, k)=\left(\frac{\sum_{y \in N(x, k)} \operatorname{distance}(x, y)}{|N(x, k)|}\right)^{-1} density(x,k)=(N(x,k)yN(x,k)?distance(x,y)?)?1

其中 N ( x , k ) N(x,k) N(x,k)指的是x的k個最近的鄰居的集合, ∣ N ( x , k ) ∣ |N(x,k)| N(x,k)表示該集合的大小,y是x最近的鄰居。

LOF

局部異常因子算法,全稱Local Outlier Factor(簡寫LOF)。LOF算法是一種無監(jiān)督的異常檢測方法,它計算給定數(shù)據(jù)點相對于其鄰居的局部密度偏差。每個樣本的異常分數(shù)稱為局部異常因子。異常分數(shù)是局部的,取決于樣本相對于周圍鄰域的隔離程度。確切地說,局部性由k近鄰給出,并使用距離估計局部密度。通過將樣本的局部密度與其鄰居的局部密度進行比較,可以識別密度明顯低于其鄰居的樣本,,這些樣本就被當做是異常樣本點。

數(shù)據(jù)點 P \mathrm{P} P 的局部相對密度(局部異常因子)為點 P \mathrm{P} P 鄰域內(nèi)點的平均局部可達密度跟數(shù)據(jù)點 的 P \mathrm{P} P局部可達密度的比值, 即:
L O F k ( P ) = ∑ O ? N k ( P ) lr ? ( O ) lr ? ( P ) ∣ N k ( P ) ∣ = ∑ O ? N k ( P ) lrd ? ( O ) ∣ N k ( P ) ∣ / lrd ? ( P ) L O F_k(P)=\frac{\sum_{O \ni N_k(P)} \frac{\operatorname{lr}(O)}{\operatorname{lr}(P)}}{\left|N_k(P)\right|}=\frac{\sum_{O \ni N_k(P)} \operatorname{lrd}(O)}{\left|N_k(P)\right|} / \operatorname{lrd}(P) LOFk?(P)=Nk?(P)O?Nk?(P)?lr(P)lr(O)??=Nk?(P)O?Nk?(P)?lrd(O)?/lrd(P)
數(shù)據(jù)點 P \mathrm{P} P 的局部可達密度 = P =\mathrm{P} =P 最近鄰的平均可達距離的倒數(shù)。距離越大,密度越小。
lrd ? k ( P ) = 1 ∑ o ? N k ( P ) ?reach? d i s t k ( P , O ) ∣ N k ( P ) ∣ \operatorname{lrd}_k(P)=\frac{1}{\frac{\sum_{o \ni N_k(P)} \text { reach }{ }_d i s t_k(P, O)}{\left|N_k(P)\right|}} lrdk?(P)=Nk?(P)o?Nk?(P)??reach?d?istk?(P,O)?1?
P \mathrm{P} P 到點 O O O 的第 k \mathrm{k} k 可達距離 = max ? =\max =max (點 O O O k \mathrm{k} k 近鄰距離,點 P \mathrm{P} P 到點 O O O 的距離)。
?reach? dist ? k ( O , P ) = max ? { d k ( O ) , d ( O , P ) } \text { reach } \operatorname{dist}_k(O, P)=\max \left\{d_k(O), d(O, P)\right\} ?reach?distk?(O,P)=max{dk?(O),d(O,P)}

數(shù)據(jù)處理,python,大數(shù)據(jù),數(shù)據(jù)分析,數(shù)據(jù)挖掘,big data

O O O k k k 近鄰距離=第 k k k 個最近的點跟點 O O O 之間的距離。

整體來說,LOF算法流程如下:

  • 對于每個數(shù)據(jù)點,計算它與其他所有點的距離,并按從近到遠排序;
  • 對于每個數(shù)據(jù)點,找到它的 K-Nearest-Neighbor,計算LOF得分。
# 參考代碼
from sklearn.neighbors import LocalOutlierFactor as LOF

clf = LOF(n_neighbors=2)
res = clf.fit_predict(data)
print(res)
print(clf.negative_outlier_factor_)

COF

COF是LOF的變種,相比于LOF,COF可以處理低密度下的異常值,COF的局部密度是基于平均鏈式距離計算得到。在開始時一樣會先計算出每個點的k-nearest neighbor。而接下來會計算每個點的Set based nearest Path,如下圖:

COF

假使k=5,所以F的neighbor為B、C、D、E、G。而對于F離他最近的點為E,所以SBN Path的第一個元素是F、第二個是E。離E最近的點為D所以第三個元素為D,接下來離D最近的點為C和G,所以第四和五個元素為C和G,最后離C最近的點為B,第六個元素為B。所以整個流程下來,F(xiàn)的SBN Path為{F, E, D, C, G, C, B}。而對于SBN Path所對應(yīng)的距離e={e1, e2, e3,…,ek},依照上面的例子e={3,2,1,1,1}。
所以可以說假使想計算p點的SBN Path,只要直接計算p點和其neighbor所有點所構(gòu)成的graph的minimum spanning tree,之后再以p點為起點執(zhí)行shortest path算法,就可以得到SBN Path。而接下來有了SBN Path,就會接著計算p點的鏈式距離:
a c ? dist ? ( p ) = ∑ i = 1 k 2 ( k + 1 ? i ) k ( k + 1 ) dist ? ( e i ) \mathrm{ac}_{-} \operatorname{dist}(p)=\sum_{i=1}^k \frac{2(k+1-i)}{k(k+1)} \operatorname{dist}\left(e_i\right) ac??dist(p)=i=1k?k(k+1)2(k+1?i)?dist(ei?)
有了ac_distance后,就可以計算COF:
COF ? ( p ) = a c ? dist ? ( p ) 1 k ∑ o ∈ N k ( p ) a c ? dist ? ( o ) \operatorname{COF}(p)=\frac{a c_{-} \operatorname{dist}(p)}{\frac{1}{k} \sum_{o \in N_k(p)} a c_{-} \operatorname{dist}(o)} COF(p)=k1?oNk?(p)?ac??dist(o)ac??dist(p)?

# 參考代碼

from pyod.models.cof import COF
cof = COF(contamination = 0.06,  ## 異常值所占的比例
          n_neighbors = 20,      ## 近鄰數(shù)量
        )
cof_label = cof.fit_predict(iris.values) # 鳶尾花數(shù)據(jù)
print("檢測出的異常值數(shù)量為:",np.sum(cof_label == 1))
(3)基于聚類的異常檢測

通常,類似的數(shù)據(jù)點往往屬于相似的組或簇,由它們與局部簇心的距離決定。正常數(shù)據(jù)距離簇中心的距離要進,而異常數(shù)據(jù)要遠離簇的中心點。聚類屬于無監(jiān)督學(xué)習(xí)領(lǐng)域中最受歡迎的算法之一,關(guān)于聚類異常檢測可分為兩步:

①利用聚類算法聚類;
②計算各個樣本點的異常程度:每個點的異常程度等于到最近類中心點的距離。

  • 方法一:丟棄遠離其他簇的小簇。
    這種方法可以與任何聚類方法一起使用,但是需要最小簇大小和小簇與其他簇之間距離的國值。通常,該過程可以簡化為丟棄小于某個最小尺寸的所有簇。這種方案對簇個數(shù)的選擇高度敏感。此外,這一方案很難將離群點得分附加在對象上。注意,把一組對像看作離群點,將離群點的概念從個體對象擴展到對象組,但是本質(zhì)上沒有任何改變。
  • 方法二:聚類所有對象,然后評估對象屬于簇的程度。
    • 對于基于原型的聚類,可以用對象到它的簇中心的距離來度量對象屬于簇的程度。
    • 對于基于目標函數(shù)的聚類方法,可以使用該目標函數(shù)來評估對象屬于任意簇的程度。
      特殊情況下,如果刪除一個對象導(dǎo)致該目標的顯著改進,則我們可以將對象分類為離群點。比如,對于K均值,刪除遠離其相關(guān)簇中心的對象能夠顯著地改進簇的誤差的平方和(SSE)。

總而言之,聚類創(chuàng)建數(shù)據(jù)的模型,而非異常扭曲模型。

K-Means聚類

創(chuàng)建了k個類似的數(shù)據(jù)點群體,不屬于這些簇(遠離簇心)的數(shù)據(jù)樣例則有可能被標記為異常數(shù)據(jù)。

# 參考代碼

# 用不同數(shù)量的質(zhì)心計算-這里劃分20個聚類
n_cluster = range(1, 20)
kmeans = [KMeans(n_clusters=i).fit(data) for i in n_cluster]
scores = [kmeans[i].score(data) for i in range(len(kmeans))]
# 這里選擇15個質(zhì)心并將這些數(shù)據(jù)添加到中心數(shù)據(jù)框中
df['cluster'] = kmeans[14].predict(data)

# 獲取每個點與其最近的質(zhì)心之間的距離。 最大距離被視為異常
distance = getDistanceByPoint(data, kmeans[14])
# 異常點的數(shù)量
number_of_outliers = int(outliers_fraction*len(distance))
# 異常判定的閾值,大于閾值判定為異常
threshold = distance.nlargest(number_of_outliers).min()
# anomaly21 包含異常結(jié)果,0為正常,1為異常
df['anomaly21'] = (distance >= threshold).astype(int)

DBSCAN

通過聚類時可以找出異常點

  • 1個核心思想:基于密度
    DBSCAN算法可以找到樣本點的全部密集區(qū)域,并把這些密集區(qū)域當做一個一個的聚類簇。

  • 2個算法參數(shù):鄰域半徑R和最少點數(shù)目minpoints
    刻畫密集 —> 當鄰域半徑R內(nèi)的點的個數(shù)大于最少點數(shù)目minpoints時,就是密集。
    數(shù)據(jù)處理,python,大數(shù)據(jù),數(shù)據(jù)分析,數(shù)據(jù)挖掘,big data

  • 3種點類別:核心點,邊界點和噪聲點
    核心點:鄰域半徑R內(nèi)樣本點的數(shù)量大于等于minpoints的點叫做核心點。
    邊界點:不屬于核心點但在某個核心點的鄰域內(nèi)的點叫做邊界點。
    噪聲點:既不是核心點也不是邊界點的是噪聲點。
    數(shù)據(jù)處理,python,大數(shù)據(jù),數(shù)據(jù)分析,數(shù)據(jù)挖掘,big data

  • 4種點的關(guān)系:密度直達,密度可達,密度相連,非密度相連
    密度直達:如果P為核心點,Q在P的R鄰域內(nèi),那么稱P到Q密度直達。任何核心點到其自身密度直達,密度直達不具有對稱性,如果P到Q密度直達,那么Q到P不一定密度直達。
    密度可達:如果存在核心點P2,P3,……,Pn,且P1到P2密度直達,P2到P3密度直達,……,P(n-1)到Pn密度直達,Pn到Q密度直達,則P1到Q密度可達。密度可達也不具有對稱性。
    密度相連:如果存在核心點S,使得S到P和Q都密度可達,則P和Q密度相連。密度相連具有對稱性,如果P和Q密度相連,那么Q和P也一定密度相連。密度相連的兩個點屬于同一個聚類簇。
    非密度相連:如果兩個點不屬于密度相連關(guān)系,則兩個點非密度相連。非密度相連的兩個點屬于不同的聚類簇,或者其中存在噪聲點。
    數(shù)據(jù)處理,python,大數(shù)據(jù),數(shù)據(jù)分析,數(shù)據(jù)挖掘,big data

判斷異常與 k-means 算法一致,在聚類時可以找出異常點。但不需要輸入簇數(shù) k 而且可以發(fā)現(xiàn)任意形狀的聚類簇。

# 參考代碼

# 直接使用sklearn庫中的DBSCAN即可
from sklearn.cluster import DBSCAN
import numpy as np
X = np.array([[1, 2], [2, 2], [2, 3],
              [8, 7], [8, 8], [25, 80]])
clustering = DBSCAN(eps=3, min_samples=2).fit(X)

clustering.labels_
array([ 0,  0,  0,  1,  1, -1])
# 0,,0,,0:表示前三個樣本被分為了一個群
# 1, 1:中間兩個被分為一個群
# -1:最后一個為異常點,不屬于任何一個群
(4)基于樹的異常檢測

這類方法為基于劃分的方法范疇。

最簡單的劃分方法就是閾值檢測,其通過人為經(jīng)驗劃定閾值,對數(shù)據(jù)進行異常判斷。
具體的,為了避免單點抖動產(chǎn)生的誤報,需要將求取累積的窗口均值進行閾值判別,具體的累積就是通過窗口進行操作:
x ^ ( t ) = x t + x t ? 1 + … + x t ? w + 1 w \hat{x}(t)=\frac{x_t+x_{t-1}+\ldots+x_{t-w+1}}{w} x^(t)=wxt?+xt?1?++xt?w+1??
高級的基于劃分的異常檢測算法,是iForest (Isolation Forest)孤立森林,一個基于Ensemble的快速異常檢測方法,具有線性時間復(fù)雜度和高精準度。與LOF、OneClassSVM相比,其占用的內(nèi)存更小、速度更快。算法原理如下: 其將時序中的數(shù)據(jù)點劃分成樹,深度越低,說明越容易被劃分,即為離群點。
算法不借助類似距離、密度等指標去描述樣本與其他樣本的差異,而是直接去刻畫所謂的疏離程度(isolation)。假設(shè)現(xiàn)在有一組一維數(shù)據(jù),我們要對這組數(shù)據(jù)進行切分,目的是把點A和 B單獨切分出來,先在最大值和最小值之間隨機選擇一個值 X,然后按照 <X 和 >=X 可以把數(shù)據(jù)分成左右兩組,在這兩組數(shù)據(jù)中分別重復(fù)這個步驟,直到數(shù)據(jù)不可再分。一些密度很高的簇要被切很多次才會停止切割,即每個點都單獨存在于一個子空間內(nèi),但那些分布稀疏的點,大都很早就停到一個子空間內(nèi)了。所以實現(xiàn)孤立森林的異常檢測。

數(shù)據(jù)處理,python,大數(shù)據(jù),數(shù)據(jù)分析,數(shù)據(jù)挖掘,big data

# 參考代碼

from sklearn.datasets import load_iris 
from sklearn.ensemble import IsolationForest

data = load_iris(as_frame=True) 
X,y = data.data,data.target 
df = data.frame 

# 模型訓(xùn)練
iforest = IsolationForest(n_estimators=100, max_samples='auto',  
                          contamination=0.05, max_features=4,  
                          bootstrap=False, n_jobs=-1, random_state=1)

#  fit_predict 函數(shù) 訓(xùn)練和預(yù)測一起 可以得到模型是否異常的判斷,-1為異常,1為正常
df['label'] = iforest.fit_predict(X) 

# 預(yù)測 decision_function 可以得出 異常評分
df['scores'] = iforest.decision_function(X)
(5)基于降維的異常檢測

PCA

PCA[線性方法]在做特征值分解之后得到的特征向量反應(yīng)了原始數(shù)據(jù)方差變化程度的不同方向,特征值為數(shù)據(jù)在對應(yīng)方向上的方差大小。所以,最大特征值對應(yīng)的特征向量為數(shù)據(jù)方差最大的方向,最小特征值對應(yīng)的特征向量為數(shù)據(jù)方差最小的方向。原始數(shù)據(jù)在不同方向上的方差變化反應(yīng)了其內(nèi)在特點。如果單個數(shù)據(jù)樣本跟整體數(shù)據(jù)樣本表現(xiàn)出的特點不太一致,比如在某些方向上跟其它數(shù)據(jù)樣本偏離較大,可能就表示該數(shù)據(jù)樣本是一個異常點。

  • PCA一種方法就是找到k個特征向量,并計算每個樣本再經(jīng)過這k個特征向量投射后的重建誤差(reconstruction error),而正常點的重建誤差應(yīng)該小于異常點。
  • 同理,也可以計算每個樣本到這k個選特征向量所構(gòu)成的超空間的加權(quán)歐氏距離(特征值越小權(quán)重越大)。
  • 也可以直接對協(xié)方差矩陣進行分析,并把樣本的馬氏距離(在考慮特征間關(guān)系時樣本到分布中心的距離)作為樣本的異常度,而這種方法也可以被理解為一種軟性(Soft PCA)
# 參考代碼

from sklearn.decomposition import PCA
pca = PCA()
pca.fit(centered_training_data)
transformed_data = pca.transform(training_data)
y = transformed_data

# 計算異常分數(shù)
lambdas = pca.singular_values_
M = ((y*y)/lambdas)

# 前k個特征向量和后r個特征向量
q = 5
print "Explained variance by first q terms: ", sum(pca.explained_variance_ratio_[:q])
q_values = list(pca.singular_values_ < .2)
r = q_values.index(True)

# 對每個樣本點進行距離求和的計算
major_components = M[:,range(q)]
minor_components = M[:,range(r, len(features))]
major_components = np.sum(major_components, axis=1)
minor_components = np.sum(minor_components, axis=1)

# 人為設(shè)定c1、c2閾值
components = pd.DataFrame({'major_components': major_components, 
                               'minor_components': minor_components})
c1 = components.quantile(0.99)['major_components']
c2 = components.quantile(0.99)['minor_components']

# 制作分類器
def classifier(major_components, minor_components):  
    major = major_components > c1
    minor = minor_components > c2    
    return np.logical_or(major,minor)

results = classifier(major_components=major_components, minor_components=minor_components)

Autoencoder

由于PCA 方法的線性使得特征維度類型的抽取上有很大限制。近年來很多神經(jīng)網(wǎng)絡(luò)的方法被用于時間序列的異常檢測,比如Autoencoder,通過引入神經(jīng)網(wǎng)絡(luò)天生的非線性性克服這些限制。

Auto-Encoder,中文稱作自編碼器,是一種無監(jiān)督式學(xué)習(xí)模型。它基于反向傳播算法與最優(yōu)化方法(如梯度下降法),利用輸入數(shù)據(jù) X X X本身作為監(jiān)督,來指導(dǎo)神經(jīng)網(wǎng)絡(luò)嘗試學(xué)習(xí)一個映射關(guān)系,從而得到一個重構(gòu)輸出 X R X^R XR。在時間序列異常檢測場景下,異常對于正常來說是少數(shù),所以我們認為,如果使用自編碼器重構(gòu)出來的輸出 X R X^R XR跟原始輸入的差異超出一定閾值(threshold)的話,原始時間序列即存在了異常。[如果樣本都是數(shù)值型,可以用MSE或MAE作為衡量指標,樣本的重建誤差越大,則表明異常的可能性越大]

算法模型包含兩個主要的部分:Encoder(編碼器)和Decoder(解碼器)。

編碼器的作用是把高維輸入 X X X編碼成低維的隱變量 h h h從而強迫神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)最有信息量的特征;解碼器的作用是把隱藏層的隱變量 h h h還原到初始維度,最好的狀態(tài)就是解碼器的輸出能夠完美地或者近似恢復(fù)出原來的輸入, 即$X^R ≈ X $ 。

# 參考代碼

import tensorflow as tf
from keras.models import Sequential
from keras.layers import Dense

# 標準化數(shù)據(jù)
scaler = preprocessing.MinMaxScaler()
X_train = pd.DataFrame(scaler.fit_transform(dataset_train),
                              columns=dataset_train.columns,
                              index=dataset_train.index)
# Random shuffle training data
X_train.sample(frac=1)
X_test = pd.DataFrame(scaler.transform(dataset_test),
                             columns=dataset_test.columns,
                             index=dataset_test.index)

tf.random.set_seed(10)
act_func = 'relu'
# Input layer:
model=Sequential()
# First hidden layer, connected to input vector X.
model.add(Dense(10,activation=act_func,
                kernel_initializer='glorot_uniform',
                kernel_regularizer=regularizers.l2(0.0),
                input_shape=(X_train.shape[1],)
               )
         )
model.add(Dense(2,activation=act_func,
                kernel_initializer='glorot_uniform'))
model.add(Dense(10,activation=act_func,
                kernel_initializer='glorot_uniform'))
model.add(Dense(X_train.shape[1],
                kernel_initializer='glorot_uniform'))
model.compile(loss='mse',optimizer='adam')
print(model.summary())

# Train model for 100 epochs, batch size of 10:
NUM_EPOCHS=100
BATCH_SIZE=10
history=model.fit(np.array(X_train),np.array(X_train),
                  batch_size=BATCH_SIZE,
                  epochs=NUM_EPOCHS,
                  validation_split=0.05,
                  verbose = 1)

plt.plot(history.history['loss'],
         'b',
         label='Training loss')
plt.plot(history.history['val_loss'],
         'r',
         label='Validation loss')
plt.legend(loc='upper right')
plt.xlabel('Epochs')
plt.ylabel('Loss, [mse]')
plt.ylim([0,.1])
plt.show()

# 查看訓(xùn)練集還原的誤差分布如何,以便制定正常的誤差分布范圍
X_pred = model.predict(np.array(X_train))
X_pred = pd.DataFrame(X_pred,
                      columns=X_train.columns)
X_pred.index = X_train.index

scored = pd.DataFrame(index=X_train.index)
scored['Loss_mae'] = np.mean(np.abs(X_pred-X_train), axis = 1)
plt.figure()
sns.distplot(scored['Loss_mae'],
             bins = 10,
             kde= True,
            color = 'blue')
plt.xlim([0.0,.5])

# 誤差閾值比對,找出異常值
X_pred = model.predict(np.array(X_test))
X_pred = pd.DataFrame(X_pred,
                      columns=X_test.columns)
X_pred.index = X_test.index
threshod = 0.3
scored = pd.DataFrame(index=X_test.index)
scored['Loss_mae'] = np.mean(np.abs(X_pred-X_test), axis = 1)
scored['Threshold'] = threshod
scored['Anomaly'] = scored['Loss_mae'] > scored['Threshold']
scored.head()
(6)基于分類的異常檢測

OneClassSVM

SVM(支持向量機)是一種用于檢測異常的有效的技術(shù)。SVM通常與監(jiān)督學(xué)習(xí)相關(guān)聯(lián),是一類對數(shù)據(jù)進行二元分類的廣義線性分類器,其決策邊界是對學(xué)習(xí)樣本求解的最大邊距超平面。

但是存在可以用于將異常識別為無監(jiān)督問題(其中訓(xùn)練數(shù)據(jù)未被標記)的擴展(OneClassCVM)。算法學(xué)習(xí)軟邊界以便使用訓(xùn)練集對正常數(shù)據(jù)實例進行聚類,然后,使用測試實例,通過調(diào)整自身以識別落在學(xué)習(xí)區(qū)域之外的異常。根據(jù)使用情況,異常檢測器的輸出可以是數(shù)字標量值,用于過濾特定于域的閾值或文本標簽(如二進制/多標簽)。

One-Class SVM 是基于一類數(shù)據(jù)(正常數(shù)據(jù))求超平面,對 SVM 算法中求解負樣本最大間隔目標進行改造,進而完成非監(jiān)督學(xué)習(xí)下的異常檢測。可以理解為這是一個新穎值檢測(Novelty Detection)算法,即在One-Class SVM 將所以與正常數(shù)據(jù)有一定區(qū)別的都當成新穎數(shù)據(jù),而我們根據(jù)實際需要設(shè)定邊界,才認為超出邊界的數(shù)據(jù)為異常數(shù)據(jù)。

# 參考代碼

from sklearn import svm
# fit the model
clf = svm.OneClassSVM(nu=0.1, kernel='rbf', gamma=0.1)
clf.fit(X)
y_pred = clf.predict(X)
# 輸出異常值
n_error_outlier = y_pred[y_pred == -1].size
(7)基于預(yù)測的異常檢測

對于單條時序數(shù)據(jù),根據(jù)其預(yù)測出來的時序曲線和真實的數(shù)據(jù)相比,求出每個點的殘差,并對殘差序列建模,利用KSigma或者分位數(shù)等方法便可以進行異常檢測。具體的流程如下:

數(shù)據(jù)處理,python,大數(shù)據(jù),數(shù)據(jù)分析,數(shù)據(jù)挖掘,big data

數(shù)據(jù)融合處理

將多維傳感器產(chǎn)生的數(shù)據(jù)進行數(shù)據(jù)融合,能夠產(chǎn)生比單一信息源更精確、更完全、更可靠的數(shù)據(jù)。數(shù)據(jù)融合分為預(yù)處理和數(shù)據(jù)融合兩步。

  1. 預(yù)處理
    1)外部校正,去除外部地形、天氣、氣壓、風(fēng)速等外部噪聲引起的對結(jié)果數(shù)據(jù)的影響,外部校正的目的主要在于去除外部隨機因素對測量數(shù)據(jù)結(jié)果一致性的影響。
    2)內(nèi)部校正,去除由于各個傳感器靈敏度、分辨率等自身參數(shù)差異引起的對結(jié)果數(shù)據(jù)的影響,內(nèi)部校正的目的主要在于消除由不同傳感器得到的數(shù)據(jù)差異。

  2. 數(shù)據(jù)融合
    根據(jù)不同的數(shù)據(jù)融合目的及數(shù)據(jù)融合所處層次,選擇恰當?shù)臄?shù)據(jù)融合算法,將提取的特征或多維數(shù)據(jù)進行合成,得到比單一傳感器更準確的表示或估計。

根據(jù)數(shù)據(jù)融合的操作對象級別從高到低分為:決策級融合、特征級融合及數(shù)據(jù)級融合。

1)數(shù)據(jù)級融合
操作對象是最前端的數(shù)據(jù),對傳感器采集到的原始數(shù)據(jù)進行處理,是最底層的融合。常用的數(shù)據(jù)級數(shù)據(jù)融合方法有:小波變換法、代數(shù)法、坎斯-托馬斯變換(Kauth-Thomas Transformation,K-T)等。

2)特征級的數(shù)據(jù)融合
特征級數(shù)據(jù)融合面向監(jiān)測對象特征的融合,從傳感器采集到的原始數(shù)據(jù)中提取特征信息,用以反映事物的屬性,以便進行綜合分析和處理,是數(shù)據(jù)融合的中間環(huán)節(jié)。
特征級數(shù)據(jù)融合一般流程為:首先對數(shù)據(jù)進行預(yù)處理,然后對數(shù)據(jù)進行特征提取,再對特征提取后的數(shù)據(jù)進行特征級融合,最后對融合后的數(shù)據(jù)屬性進行說明。

3)決策級數(shù)據(jù)融合
在底層兩級數(shù)據(jù)融合的基礎(chǔ)上,對數(shù)據(jù)進行特征提取、數(shù)據(jù)分類及邏輯運算,為管理者決策提供輔助。所需的決策是最高級的數(shù)據(jù)融合。該級別數(shù)據(jù)融合的特點是容錯性、實時性好,當一個或幾個傳感器失效時,仍能做出決策。
決策級數(shù)據(jù)融合一般流程為:對數(shù)據(jù)進行預(yù)處理,然后對數(shù)據(jù)進行特征提取,再對特征進行屬性說明,對屬性進行融合,最后對融合屬性進行說明。

通過不同的融合操作來對多傳感器測量數(shù)據(jù)進行數(shù)據(jù)合并,減少存儲數(shù)據(jù)量,降低數(shù)據(jù)分辨率,但同時也能呈現(xiàn)出融合后數(shù)據(jù)保留所需的全部信息。

# 參考代碼

# 這里簡單介紹對多個傳感器測量一個特征的數(shù)據(jù)采用‘卡爾曼濾波’來進行 數(shù)據(jù)融合

# 卡爾曼增益 = 數(shù)據(jù)1的誤差 除以 (數(shù)據(jù)1的誤差 + 數(shù)據(jù)2的誤差)
# 誤差對應(yīng)方差
def kalman_gain(e1, e2):
    return e1/(e1 + e2)
 
# 估計值 = 數(shù)據(jù)1的估計值 + 系數(shù)*(數(shù)據(jù)2測量值 - 數(shù)據(jù)1的估計值)
def now_estimated_value(X1, K, X2):
    return X1 + K(X2 - X1)
 
# 更新估計誤差 = (1 - 卡爾曼增益)* 數(shù)據(jù)1的估計誤差 + 卡爾曼增益* 數(shù)據(jù)2的估計誤差
def now_estimated_error(K, e1, e2):
    return (1 - K)*e1 + K*e2
 
# 循環(huán)體
K = kalman_gain(e1, e2)
X_k = now_estimated_value(X1, K, X2)
e_EST = now_estimated_error(K, e1, e2)

數(shù)據(jù)降維處理

對多個變量的大數(shù)據(jù)分析時,會有很多豐富信息,變量之間可能存在相關(guān)性,但增加了問題分析的復(fù)雜性。 而將每個指標進行分析,分析往往是孤立的,不能完全利用數(shù)據(jù)中的信息,因此盲目減少指標會損失很多有用的信息,甚至還可能產(chǎn)生錯誤的結(jié)論。

考慮將關(guān)系緊密的變量變成盡可能少的新變量,使這些新變量是兩兩不相關(guān)的,那么就可以用較少的綜合指標分別代表存在于各個變量中的各類信息。使得在減少需要分析的指標同時,盡量減少原指標包含信息的損失,以達到對所收集數(shù)據(jù)進行全面分析的目的。

PCA 分析

主成分分析法 (Principal Componet Analysis, PCA)本質(zhì)是通過某種線性映射,將高維數(shù)據(jù)映射到低維的空間中表示,并期望在所投影的維度上數(shù)據(jù)的方差最大,以此達到用較少的數(shù)據(jù)維度來保留較多的原數(shù)據(jù)點特性的效果。主要思想是將n維特征映射到k維上,這k維是全新的正交特征也被稱為主成分,是在原有n維特征的基礎(chǔ)上重新構(gòu)造出來的k維特征。PCA的工作就是從原始的空間中順序地找一組相互正交的坐標軸,新的坐標軸的選擇與數(shù)據(jù)本身是密切相關(guān)的。其中,第一個新坐標軸選擇是原始數(shù)據(jù)中方差最大的方向,第二個新坐標軸選取是與第一個坐標軸正交的平面中使得方差最大的,第三個軸是與第1,2個軸正交的平面中方差最大的。依次類推,可以得到n個這樣的坐標軸。通過這種方式獲得的新的坐標軸,我們發(fā)現(xiàn),大部分方差都包含在前面k個坐標軸中,后面的坐標軸所含的方差幾乎為0。 之后,可以忽略余下的坐標軸,只保留前面k個含有絕大部分方差的坐標軸。事實上,這相當于只保留包含絕大部分方差的維度特征,而忽略包含方差幾乎為0的特征維度,實現(xiàn)對數(shù)據(jù)特征的降維處理。

在計算上,通過計算數(shù)據(jù)矩陣的協(xié)方差矩陣,然后得到協(xié)方差矩陣的特征值特征向量,選擇特征值最大(即方差最大)的k個特征所對應(yīng)的特征向量組成的矩陣。這樣就可以將數(shù)據(jù)矩陣轉(zhuǎn)換到新的空間當中,實現(xiàn)數(shù)據(jù)特征的降維。

# 參考代碼

# 直接調(diào)用sklearn庫中PCA
# X_new為標準化后的數(shù)據(jù)
from sklearn.decomposition import PCA
pca = PCA(n_components=2) # 設(shè)置PCA模型的參數(shù)n_components為2,即將三維數(shù)據(jù)降為二維數(shù)據(jù)
pca.fit(X_new) # 對標準化后的數(shù)據(jù)進行模型訓(xùn)練
X_transformed = pca.transform(X_new) # 對標準化后的數(shù)據(jù)進行降維
print(X_transformed)
print(pca.components_) # 獲取線性組合系數(shù)

數(shù)據(jù)標準化

數(shù)據(jù)標準化是指通過一定的方法和比例將數(shù)據(jù)映射到指定區(qū)間,根據(jù)使用函數(shù)的不同可以歸納為三類:直線型無量綱法、折線形無量綱法以及曲線型無量綱法。一些原始數(shù)據(jù)集是沒有經(jīng)過轉(zhuǎn)化的有量綱數(shù)據(jù),如果將其直接輸入到模型中進行訓(xùn)練,受不同量綱特征的影響,會導(dǎo)致模型的收斂速度變慢,并且當特征量綱級別相差特別大時,模型可能會忽略掉量綱較小的特征而達不到理想效果。因此,在模型訓(xùn)練前,需要通過標準化方法將數(shù)據(jù)轉(zhuǎn)換成無量綱數(shù)據(jù),以消除量綱對模型產(chǎn)生的影響。常見的標準化方法有如下幾種:

(1)min-max標準化(歸一化):該方法是基于樣本中的兩個最值進行轉(zhuǎn)換的,把最大值歸為1,最小值歸為0,其他值在其中分布。對于每個屬性,設(shè)minA和maxA分別為屬性A的最小值和最大值,將A的一個原始值x通過min-max標準化映射成在區(qū)間[0,1]中的值x’,其公式為:新數(shù)據(jù)=(原數(shù)據(jù) - 最小值)/(最大值 - 最小值)
X n e v = X ? X min ? X max ? ? X min ? X_{n e v}=\frac{X-X_{\min }}{X_{\max }-X_{\min }} Xnev?=Xmax??Xmin?X?Xmin??

# 參考代碼

from sklearn import preprocessing
# feature_range設(shè)置最大最小變換值,默認(0,1)
min_max_normalizer=preprocessing.MinMaxScaler(feature_range=(0,1))
# 將數(shù)據(jù)縮放(映射)到設(shè)置固定區(qū)間
scaled_data=min_max_normalizer.fit_transform(data)
# 將變換后的數(shù)據(jù)轉(zhuǎn)換為dataframe對象
price_frame_normalized=pandas.DataFrame(scaled_data)

(2)z-score標準化(規(guī)范化):一般把均值歸一化為0,方差歸一化1。基于原始數(shù)據(jù)的均值(mean)和標準差(standarddeviation)進行數(shù)據(jù)的標準化。將A的原始值x使用z-score標準化到x’。z-score標準化方法適用于屬性A的最大值和最小值未知的情況,或有超出取值范圍的離群數(shù)據(jù)的情況,其公式為:新數(shù)據(jù)=(原數(shù)據(jù)-均值)/標準差
X new? = X ? μ σ X_{\text {new }}=\frac{X-\mu}{\sigma} Xnew??=σX?μ?

# 參考代碼

from sklearn import preprocessing
# Z-Score標準化
zscore_scaler=preprocessing.StandardScaler()
data_scaler_1=zscore_scaler.fit_transform(data)

(3)正則化:數(shù)據(jù)正則化是將樣本的某個范數(shù)(如L1范數(shù))縮放到到位1,正則化的過程是針對單個樣本的,對于每個樣本將樣本縮放到單位范數(shù)。

# 參考代碼

def proportional_normalization(value):
    """比例歸一
    公式:值/總和
    return 值域[0,1]
    """
    new_value = value / value.sum()
    return new_value

(4) log ? \log log 對數(shù)轉(zhuǎn)換: 該方法是將滿足特定條件的樣本序列通過對數(shù)函數(shù)進行轉(zhuǎn)換,其計算公式下所示。
X new? = log ? 10 X log ? 10 X max? X_{\text {new }}=\frac{\log _{10} X}{\log _{10} X_{\text {max }}} Xnew??=log10?Xmax??log10?X?
? 其中, X = { x 1 , x 2 , ? ? , x i , ? ? , x n } X=\left\{x_1, x_2, \cdots, x_i, \cdots, x_n\right\} X={x1?,x2?,?,xi?,?,xn?} 代表原始特征序列, 且需要滿足 x i ≥ 1 x_i \geq 1 xi?1 。

# 參考代碼

def log_transfer(value):
    """log轉(zhuǎn)換,需要原始數(shù)據(jù)都大于1
    公式:log10(x)/log10(max)
    return 值域[0,1]
    """
    new_value = np.log10(value) / np.log10(value.max())
    return new_value

(5)logistic 函數(shù)變換: 該方法是利用 Sigmoid 函數(shù)對數(shù)據(jù)進行轉(zhuǎn)換, 其計算公式如下所示。
X n ?new? = 1 1 + e ? x X_{n \text { new }}=\frac{1}{1+e^{-x}} Xn?new??=1+e?x1?

# 參考代碼

def sigmoid(value):
    """logistic轉(zhuǎn)換,定義Sigmoid函數(shù)
    new_value = 1.0/(1+np.exp(-value))
    return new_value

特征工程

特征工程是指通過對原始數(shù)據(jù)進行分析與轉(zhuǎn)換以獲取對目標任務(wù)更好的表達,它是構(gòu)造一個優(yōu)秀模型的必要環(huán)節(jié)。因此,在經(jīng)過數(shù)據(jù)預(yù)處理后,還需要通過一系列的特征工程方法對數(shù)據(jù)進行分析處理,挖掘其中的關(guān)鍵信息,來提升模型的穩(wěn)定性和魯棒性。常用的特征工程方法主要包括特征編碼、相關(guān)性分析、特征篩選等。

1、特征編碼
  1. one-hot編碼
    one-hot編碼是常用的編碼方式之一,它可以將類別特征映射成只包含0和1的維向量進行輸出。假設(shè)類別型特征共有n個不同的類別,進行編碼前需要根據(jù)類別數(shù)量建立一個n維詞表,在對詞表中第i個類別進行one-hot編碼時,會輸出一個n維的特征向量,該向量中位置i的值為1,其余位置的值均為0。one-hot編碼雖然簡單易用,但它無法處理類別間具有的關(guān)聯(lián)性,這在一定程度上會影響模型對參數(shù)的擬合,并且當類別數(shù)量巨大時,還會使編碼后的數(shù)據(jù)變得十分稀疏,導(dǎo)致模型訓(xùn)練速度變慢、效果變差。
    數(shù)據(jù)處理,python,大數(shù)據(jù),數(shù)據(jù)分析,數(shù)據(jù)挖掘,big data

  2. Word2vec編碼
    Word2vec編碼最先出現(xiàn)在 NLP(Natural Language Processing)領(lǐng)域,因為其效果好,被廣泛引入到其他領(lǐng)域進行使用。Word2vec編碼克服了one-hot編碼的缺點,通過Word2vec編碼可以將類別型特征映射成具有上下文關(guān)聯(lián)性的向量,并且該向量也具有固定大小,不會形成稀疏矩陣。Word2vec是基于CBOW(Continuous Bag-of-Words Model)和Skip-Gram模型進行編碼。通過Word2vec編碼的每個嵌入向量會在模型訓(xùn)練時進行自動更新以獲得最好的上下文關(guān)聯(lián)性表達,當模型訓(xùn)練結(jié)束后可以獲得固定的編碼向量。
    數(shù)據(jù)處理,python,大數(shù)據(jù),數(shù)據(jù)分析,數(shù)據(jù)挖掘,big data

2、特性相關(guān)性分析

一般數(shù)據(jù)特征間具有一定程度的線性和非線性關(guān)聯(lián)關(guān)系,傳統(tǒng)模型如SVM、LR等是難以學(xué)習(xí)到特征間的這些相關(guān)性。因此需要通過輔助方法對特征的相關(guān)性進行分析,根據(jù)分析結(jié)果,再結(jié)合相關(guān)領(lǐng)域的知識以及對業(yè)務(wù)問題的專業(yè)理解,通過特征組合、特征交叉或者加減乘除的方式去構(gòu)建出更能描述目標問題的關(guān)鍵特征。常見的特征相關(guān)性分析方法主要有:Pearson相關(guān)性系數(shù)、最大互信息系數(shù)。

  1. Pearson 相關(guān)性系數(shù)
    Pearson相關(guān)性系數(shù)可用于衡量兩個特征間線性相關(guān)程度。假設(shè)數(shù)據(jù)集中存在兩個特征變量X =(x1,x2,…,xn)和Y=(y1,y2,…,yn),通過公式可以計算出X和Y的Pearson系數(shù),該公式輸出結(jié)果的范圍在[-1,1]之間,零表示線性無關(guān),正數(shù)表示正相關(guān),負數(shù)表示負相關(guān),并且Pearson系數(shù)的絕對值越大,兩特征的相關(guān)程度就越高。
    r = ∑ i = 1 n ( x i ? x ˉ ) ( y i ? y ˉ ) ∑ i = 1 n ( x i ? x ˉ ) 2 ∑ i = 1 n ( y i ? y ˉ ) 2 r=\frac{\sum_{i=1}^n\left(x_i-\bar{x}\right)\left(y_i-\bar{y}\right)}{\sqrt{\sum_{i=1}^n\left(x_i-\bar{x}\right)^2} \sqrt{\sum_{i=1}^n\left(y_i-\bar{y}\right)^2}} r=i=1n?(xi??xˉ)2 ?i=1n?(yi??yˉ?)2 ?i=1n?(xi??xˉ)(yi??yˉ?)?

? 其中, x i x_i xi? y i y_i yi? 表示數(shù)據(jù)集的第 i i i 個樣本中特征變量 X X X Y Y Y 對應(yīng)的取值, x ˉ \bar{x} xˉ y ˉ \bar{y} yˉ? 表示特征變量 X X X Y Y Y 的均值, n n n 表示樣本數(shù)量。

  1. 最大互信息系數(shù)
    最大互信息系數(shù)(MIC)可用于衡量兩個特征間的線性或非線性關(guān)聯(lián)程度,并且MIC值越大,兩個特征的相關(guān)程度越高,其計算公式如下。MIC的具體思想如下:首先,根據(jù)兩個特征的值以散點圖的方式將數(shù)據(jù)點散落到二維平面中;接著,根據(jù)指定的網(wǎng)格分辨率對平面進行網(wǎng)格化,計算該網(wǎng)格分辨率下不同劃分方式的最大互信息值,并進行歸一化;最后,求出各網(wǎng)格分辨率中互信息的最大值作為MIC值。
    MIC ? ( D ) = max ? a × b < B ( n ) I ( a × b , X , Y ) log ? ( min ? ( a , b ) ) \operatorname{MIC}(D)=\max _{a \times b<B(n)} \frac{I(a \times b, X, Y)}{\log (\min (a, b))} \quad MIC(D)=a×b<B(n)max?log(min(a,b))I(a×b,X,Y)?

? 其中, I ( a × b , X , Y ) I(a \times b, X, Y) I(a×b,X,Y)表示在格分辨率 a × b a \times b a×b 下特征變量 X X X Y Y Y 的最大互信息值, log ? ( min ? ( a , b ) ) \log (\min (a, b)) log(min(a,b)) 表示歸一化因子, B ( n ) B(n) B(n) 表示最大的網(wǎng)格分辨率。

3、特征選擇

結(jié)合領(lǐng)域?qū)I(yè)知識和相關(guān)任務(wù)要求對高維特征進行特征的篩選,可以選出需要的特征來進行后續(xù)模型的訓(xùn)練等步驟。常用的特征篩選方法有:
(1)方差選擇法:該方法是通過計算每一列特征的方差,并根據(jù)設(shè)定的閱值來判段是否需要保留或者刪除特征變量。如果某一列特征的方差很小,那么認為該列特征中所有數(shù)據(jù)幾乎是沒有變化的,這些無變化的數(shù)據(jù)對模型的訓(xùn)練沒有任何意義,因此需要進行刪除。
(2)樹模型選擇法:該方法是基于樹模型(如XGBoost,RF)來進行特征選擇,通過計算信息增益來給每個特征的重要度進行打分,從而可以選擇出重要性高的特征、
(3)遞歸特征消除法:該方法通過選擇一個基模型(如SVM、LR),并利用數(shù)據(jù)集對其進行多輪訓(xùn)練,每輪訓(xùn)練結(jié)束后,刪除權(quán)重較低的特征,再進入下一輪次的訓(xùn)練,重復(fù)這個過程,直到剩余的特征數(shù)量與預(yù)先設(shè)定的特征數(shù)量一致。文章來源地址http://www.zghlxwxcb.cn/news/detail-780619.html

到了這里,關(guān)于數(shù)據(jù)處理方法整理【目前最全】的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【Python】數(shù)據(jù)預(yù)處理之將類別數(shù)據(jù)轉(zhuǎn)換為數(shù)值的方法(含Python代碼分析)

    在進行Python數(shù)據(jù)分析的時候,首先要進行數(shù)據(jù)預(yù)處理。但是有時候不得不處理一些非數(shù)值類別的數(shù)據(jù),遇到這類問題時該怎么解決呢? 目前為止,總結(jié)了三種方法,這里分享給大家。 這種方法是屬于映射字典將類標轉(zhuǎn)換為整數(shù),不過這種方法適用范圍有限。 我們首先創(chuàng)建一

    2024年02月09日
    瀏覽(26)
  • 【python】數(shù)據(jù)挖掘分析清洗——缺失值處理方法匯總

    【python】數(shù)據(jù)挖掘分析清洗——缺失值處理方法匯總

    本文鏈接:https://blog.csdn.net/weixin_47058355/article/details/128866686 數(shù)據(jù)挖掘系列: 缺失值處理方法匯總 離散化方法匯總 離群點(異常值)處理方法匯總 標準化(數(shù)據(jù)歸一化)處理方法匯總 特征選擇(特征篩選)方法匯總 特征選擇篩選(降維)方法匯總 分類預(yù)測方法匯總 看了下網(wǎng)絡(luò)上做

    2024年02月02日
    瀏覽(34)
  • 【數(shù)據(jù)分析】Python:處理缺失值的常見方法

    【數(shù)據(jù)分析】Python:處理缺失值的常見方法

    在數(shù)據(jù)分析和機器學(xué)習(xí)中,缺失值是一種常見的現(xiàn)象。在實際數(shù)據(jù)集中,某些變量的某些條目可能沒有可用的值。處理缺失值是一個重要的數(shù)據(jù)預(yù)處理步驟。在本文中,我們將介紹如何在 Pandas 中處理缺失值。 我們將探討以下內(nèi)容: 什么是缺失值; 如何在 Pandas 中識別缺失值

    2024年02月03日
    瀏覽(50)
  • Spark中數(shù)據(jù)預(yù)處理和清洗的方法(python)

    在Spark中進行數(shù)據(jù)分析,數(shù)據(jù)預(yù)處理和清洗是必不可少的步驟,以下是一些常用的方法: 去除重復(fù)行 去除空值 替換空值 更改數(shù)據(jù)類型 分割列 合并列 過濾行 去除重復(fù)行可以使用DataFrame的 dropDuplicates() 方法,例如: 去除空值可以使用DataFrame的 dropna() 方法,例如: 可以通過指

    2024年02月11日
    瀏覽(44)
  • sparkSql數(shù)據(jù)離線處理--整理記錄

    sparkSql數(shù)據(jù)離線處理--整理記錄

    前言:本文作為本人學(xué)習(xí)sparkSql離線數(shù)據(jù)抽取,離線數(shù)據(jù)處理的學(xué)習(xí)整理記錄,文中參考博客均附上原文鏈接。 1、配置文件準備: /opt/hive/conf/ hive-site.xml :(2021/12/31修改,添加了useSSL=falseuseUnicode=truecharacterEncoding=utf8支持中文編碼) 若要在idea環(huán)境下運行要把 hdfs-site.xml core-site

    2023年04月09日
    瀏覽(31)
  • 【python】數(shù)據(jù)挖掘分析清洗——離群點(異常值)處理方法匯總

    【python】數(shù)據(jù)挖掘分析清洗——離群點(異常值)處理方法匯總

    本文鏈接:https://blog.csdn.net/weixin_47058355/article/details/129949060?spm=1001.2014.3001.5501 異常值處理的意義在于提高數(shù)據(jù)分析的準確性和可靠性。異常值往往會影響數(shù)據(jù)的統(tǒng)計特征,如平均值、方差等,從而導(dǎo)致錯誤的結(jié)論或預(yù)測結(jié)果。此外,異常值還可能干擾模型的擬合效果,使得模

    2024年02月08日
    瀏覽(27)
  • excel數(shù)據(jù)的編排與整理——行列的批量處理

    excel數(shù)據(jù)的編排與整理——行列的批量處理

    1.1 插入連續(xù)行 1.1.0 題目內(nèi)容 1.1.1 選中插入的位置?按住shift鍵?往下選中2行 1.1.2 鼠標右擊?點擊插入 1.1.3 插入后的效果 1.2 插入不連續(xù)行 1.2.0 題目內(nèi)容 1.2.1 按下ctrl鍵?選中插入的位置,需要插入多行時,需要按下shift鍵?再往下選中1行 1.2.2 鼠標右擊?點擊插入 1.2.3 插入后

    2024年02月10日
    瀏覽(18)
  • 最全可白嫖之高光譜圖像數(shù)據(jù)處理(格式轉(zhuǎn)換,數(shù)據(jù)增強,通道剪切,大小裁剪,光譜顯示,折線圖表示)

    最全可白嫖之高光譜圖像數(shù)據(jù)處理(格式轉(zhuǎn)換,數(shù)據(jù)增強,通道剪切,大小裁剪,光譜顯示,折線圖表示)

    完整代碼下載地址: 高光譜數(shù)據(jù)處理大禮包 ??網(wǎng)上的很多公開高光譜數(shù)據(jù)集(如cave,icvl等)下載下來是 raw 格式,而一般用神經(jīng)網(wǎng)絡(luò)等方法對高光譜數(shù)據(jù)進行分類、訓(xùn)練、超分辨的時候,大多使用 .mat 格式的高光譜數(shù)據(jù),礙于網(wǎng)上一直沒有一個系統(tǒng)全面的方法,于是我總結(jié)

    2024年02月05日
    瀏覽(44)
  • 圖像處理及深度學(xué)習(xí)開源數(shù)據(jù)集大全(四萬字嘔心瀝血整理)

    本文整理了150 余個深度學(xué)習(xí)和圖像處理領(lǐng)域的開源數(shù)據(jù)集,包括:目標檢測、人臉識別、文本識別、圖像分類、缺陷檢測、醫(yī)學(xué)影像、圖像分割、圖像去霧、關(guān)鍵點檢測、動作識別、姿態(tài)估計、自動駕駛、RGBT共13個方向。 T-LESS數(shù)據(jù)集 類型:目標檢測 數(shù)量:39000 數(shù)據(jù)集下載地

    2024年02月03日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包