多標籤ReliefF演算法的Python實現

2021-10-09 12:21:01 字數 3693 閱讀 7258

先宣告一下,python是有第三方relieff包的,安裝方式直接在pycharm終端輸入:

匯入方式:

from relieff import relieff
但是,這個包有一些問題。

首先,只針對單標籤且資料型別是離散型別的資料集

第二,沒有對標籤下的每個類別進行計算;

第三,它的選取樣本的策略是迴圈全部樣本,沒有進行隨機選取。

所以,在這個第三方包的基礎上,我對它進行了一點改進。

1、適用於多標籤資料集

2、適用於連續型資料集

3、類中增加了隨機樣本的選取數量的引數

下面是改進的**:

# -*- coding: utf-8 -*-

from __future__ import print_function

import numpy as np

import random

from sklearn.neighbors import kdtree

class

multirelieff

(object):

def__init__

(self, n_neighbors=

10, n_features_to_keep=

10, n_selected=10)

:"""

初始化例項化物件

:param n_neighbors: 最近鄰個數

:param n_features_to_keep: 選取特徵相關統計量最大的數量

"""self.feature_scores =

none

self.top_features =

none

self.tree =

none

self.n_neighbors = n_neighbors

self.n_features_to_keep = n_features_to_keep

self.n_selected = n_selected

deffit(self, x, y)

:"""

計算特徵的相關統計量的大小

:param x: 資料部分

:param y: 標籤部分

:return: 返回特徵相關統計量數值的列表

"""# 記錄每個特徵的相關統計量,並初始化為0

self.feature_scores = np.zeros(x.shape[1]

)# 獲得了kdtree類例項化物件,後面用這個物件獲得每個隨機樣本的k個最近鄰

self.tree = kdtree(x)

num = x.

max(axis=0)

- x.

min(axis=0)

# 在樣本數量範圍內進行不重複的隨機取樣self.n_selected次

random_list = random.sample(

range(0

, x.shape[0]

), self.n_selected)

for source_index in random_list:

w = np.zeros(x.shape[1]

)# 當前採用的是單位權重計算公式。由於多標籤中標籤之間可能有相關性,所以不能簡單的拿單標籤的去計算。

# 也可以採用其他權重計算公式

weight = np.

sum(y[source_index]

)/ y.shape[1]

# 由於是多標籤資料集,所以需要對每乙個標籤進行傳統意義上的relieff查詢,再對查詢出的結果進行加權。

for label_index in

range

(y.shape[1]

):label_data = y[

:, label_index]

# 此時是標籤下的每乙個分類

diff_a = np.zeros(x.shape[1]

) diff_b = np.zeros(x.shape[1]

)# 對每乙個標籤進行去重,根據這個標籤擁有的類別數進行迴圈,找到隨機樣本在每一類中的k個最近鄰

for label in np.unique(label_data)

:# 通過np.where方法找到所有當前類別的樣本的索引

each_class_samples_index = np.where(label_data == label)[0

]# 呼叫kdtree方法找到最近鄰

data = x[each_class_samples_index,:]

distances, indices = self.tree.query(

x[source_index]

.reshape(1,

-1), k=self.n_neighbors +1)

# 此時indices是每個標籤下每個類別中的k個近鄰,因為自己離自己最近,所以要從1開始

indices = indices[0]

[1:]

# 本次實驗所採用的資料集是連續型別的,所以要採用距離計算

# 如果是離散型別,那就直接調np.equal方法

if label == label_data[source_index]

: diff_a = np.

sum(

(x[indices]

- x[source_index])**

2, axis=0)

/ num

else

: prob =

len(each_class_samples_index)

/ x.shape[0]

# 異類樣本的相關統計量計算需要再乘以異類樣本佔所有樣本的比例

diff_b += prob *

(np.

sum(

(x[indices]

- x[source_index])**

2, axis=0)

/ num)

# 最後對每乙個標籤的計算結果進行加權,就得到了最終每個樣本計算的最終的相關統計量

w += weight *

(diff_b - diff_a)

/(self.n_neighbors * self.n_selected)

self.feature_scores += w

# 根據物件初始化時的值,返回靠前的一些特徵組成的資料子集。

self.top_features = np.argsort(self.feature_scores)[:

:-1]

return x[

:, self.top_features[

:self.n_features_to_keep]

]

測試**:

mul_r = multirelieff(n_neighbors=

10, n_features_to_keep=

10, n_selected=

100)

.fit(train_data, train_target)

print

(mul_r.shape)

結果:

多標籤分類演算法的研究進展

在機器學習方向的相關研究中,分類問題可以被分為二分類問題 多分類問題及多標籤分類問題。二分類問題即二元分類問題,其中某個樣本只有 屬於 或 不屬於 這一類兩種情況 也可以稱之為 0 1 分類,屬於這一類即為 1 不屬於即為 0 多分類問題也可稱為多類別分類問題,即乙個樣本屬於且僅屬於多個類 一般多於...

MacOS下Python的多版本管理(pyenv)

與windows下設定絕對路徑不同,pyenv使用了一種更優雅的方式來管理python的版本。pyenv通過在 path的最前面插入乙個墊片路徑 shims 例如 pyenv shims usr local bin usr bin bin 當查詢python的可執行檔案時,會自動跳轉到這個shims...

多標籤分類的評價指標

多標籤分類作為多分類的一種推廣,每個樣本可以有多個類別,如下圖的標籤為 sea,sunset。所以其評價指標與多分類的也有差異,本文將介紹幾種評價指標。1.hamming loss 漢明損失 表示所有label中錯誤樣本的比例,所以該值越小則網路的分類能力越強。計算公式如下。其中 d 表示樣本總數,...