先宣告一下,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 表示樣本總數,...