2017-03-13 27 views
0

我有一個大小爲200的小數據集。數據集非常簡單:每行包含映射到單個標籤的範圍[0,1]中的實數值。共有24個標籤,我的任務的本質是培訓一個分類器,以基本上找到一個映射到標籤的範圍。ML用於數值轉換

有兩種方法我能想到。第一個是SVC,因爲它能將輸入平面分成24個區域,這正是我需要的。然而,當我嘗試對它進行編碼時,結果出現了一些可怕的結果:分類器沒有學到任何東西,並且不管輸入值如何都會拋出相同的標籤。

我正在考慮的第二種方法是神經網絡,但由於缺乏特徵和訓練數據,我非常懷疑這種方法的可行性。

如果需要,我可以分享我使用scikit-learn開發的SVC代碼。

下面就一起來看看我的數據,我已經傾倒到終端:

Label: Min, Mean, Max 
{0: [0.96, 0.98, 1.0], 
1: [0.15, 0.36, 0.92], 
2: [0.14, 0.56, 0.98], 
3: [0.37, 0.7, 1.0], 
4: [0.23, 0.23, 0.23], 
6: [0.41, 0.63, 0.97], 
7: [0.13, 0.38, 0.61], 
8: [0.11, 0.68, 1.0], 
9: [0.09, 0.51, 1.0], 
10: [0.19, 0.61, 0.97], 
11: [0.26, 0.41, 0.57], 
12: [0.29, 0.72, 0.95], 
13: [0.63, 0.9, 0.99], 
14: [0.06, 0.55, 1.0], 
15: [0.1, 0.64, 1.0], 
16: [0.26, 0.58, 0.95], 
17: [0.29, 0.88, 1.0], 
21: [0.58, 0.79, 1.0], 
22: [0.24, 0.59, 0.94], 
23: [0.12, 0.62, 0.95]} 

正如你所看到的,數據是所有的地方,但我想看看是否有可能找到每個標籤最能代表的範圍。

如果有人能告訴我我是否在正確的軌道上,我將不勝感激。謝謝!

+0

那麼......你對這些數據的假設是什麼?一些模型的想法? – sascha

+0

那麼,我所做的最大的假設是標籤所代表的範圍不會相互重疊。所以,實際上,我的標籤將[0,1]劃分爲24個獨特的不同空間。 至於模型的想法,我列出了其中2我已經試過一個似乎並不工作。 :] –

+0

爲什麼不顯示你的數據? – sascha

回答

2

如果我們假設每個班的樣本都有些集中(但仍然很嘈雜;可能會有重疊),sklearn中可能最自然的分類是Gaussian Naive Bayes,我們假設每班的分數都遵循正態分佈。

下面是一些代碼,它建立一些假數據,其進行分類和評估:

import numpy as np 
from sklearn.model_selection import train_test_split 
from sklearn.naive_bayes import GaussianNB 
from sklearn.metrics import accuracy_score 
np.random.seed(1) 


""" Data-params + Data-generation """ 
N_CLASSES = 24 
N_SAMPLES_PER_CLASS = 10 
SIGMA = 0.01 

class_centers = np.random.random(size=N_CLASSES) 
# ugly code with bad numpy-style 
X = [] 
for class_center in class_centers: 
    samples = np.random.normal(size=N_SAMPLES_PER_CLASS)*SIGMA 
    for sample in samples + class_center: 
     X.append(sample) 
Y = [] 
for ind, c in enumerate(class_centers): 
    for s in range(N_SAMPLES_PER_CLASS): 
     Y.append(ind) 

X = np.array(X).reshape(-1, 1) 
Y = np.array(Y) 

""" Split & Fit & Eval """ 
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.1, random_state=0) 

et = GaussianNB() 
et.fit(X_train, y_train) 

print('Prediction on test') 
preds = et.predict(X_test) 
print(preds) 

print('Original samples') 
print(y_test) 

print('Accuracy-score') 
print(accuracy_score(y_test, preds)) 

輸出

Prediction on test 
[10 7 3 7 8 3 23 3 11 19 7 20 8 15 11 13 18 11 3 16 8 9 8 12] 
Original samples 
[10 7 3 7 10 22 15 22 15 19 7 20 8 15 23 13 18 11 22 0 10 17 8 12] 
Accuracy-score 
0.583333333333 

結果當然是高度依賴於N_SAMPLES_PER_CLASSSIGMA

編輯:

正如你現在提出的數據,很明顯,我的假設不成立。 見這段代碼做了如下圖(文件是從[]()剝離;人們真的應該張貼CSV兼容的數據!):

import pandas as pd 
import matplotlib.pyplot as plt 
import seaborn as sns 

data = pd.read_csv('idVXjwgZ.txt', usecols=[0,1], names=['x', 'y']) 
sns.swarmplot(data=data, x='y', y='x') 
plt.show() 

簡介:

enter image description here

現在想想觀察一些x,你需要決定y。對於大多數x-範圍相當困難。

顯然還有類平衡問題,它解釋了大多數預測的14類輸出。

+0

嗨!感謝您的回答。是的,你已經正確地認爲有重疊。我編輯了我的帖子以顯示數據。 我也試過你的方法,這就是我得到的輸出: ''[14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14]' 這與LinearSVC給我的相似。 –

1

如果標籤範圍不重疊,那麼這不是ML問題;這是一個簡單的列表排序任務。對實數的數據進行排序;按標籤分組。在每個標籤中,取最小值和最大值;那是你的範圍。

如果您需要分區,請按照其實際值的順序對範圍進行排序。對於每一對相鄰的類,取邊界值的中間值,並在這些類之間進行分區。

例如,給定12個值在3類

(0.10, 3), (0.40, 2), (0.11, 3), (0.24, 1), 
(0.20, 1), (0.21, 1), (0.12, 3), (0.41, 2), 
(0.18, 3), (0.42, 2), (0.46, 2), (0.22, 1) 

排序列表由每對中的第一個值的列表:

(0.10, 3), (0.11, 3), (0.12, 3), (0.18, 3), 
(0.20, 1), (0.21, 1), (0.22, 1), (0.24, 1), 
(0.40, 2), (0.41, 2), (0.42, 2), (0.46, 2), 

現在具有用於每個標籤的範圍:

3 [0.10 - 0.18] 
1 [0.20 - 0.24] 
2 [0.40 - 0.46] 

如果你想分區值,只取邊界平均水平,你有值0.19和0 .32來分隔你的課程。

+0

我很抱歉。我從來沒有打算說他們不重疊。他們其實是這樣做的。然而,我想要找到標籤所代表的最佳專屬範圍......希望澄清事情! –