2017-03-13 2 views
0

데이터 세트는 매우 간단합니다. 데이터 세트는 매우 간단합니다. 각 행은 [0, 1] 범위의 실수 값으로 구성되어 단일 레이블에 매핑됩니다. 총 24 개의 레이블이 있으며, 내 작업의 핵심은 기본적으로 레이블에 매핑되는 범위를 찾기 위해 분류자를 훈련시키는 것입니다.수치 변환을위한 ML

내가 생각할 수있는 두 가지 접근 방식이 있습니다. 첫 번째는 입력 평면을 24 개의 영역으로 분리 할 수있는 능력 때문에 SVC입니다. 이것이 내가 원하는 것입니다. 그러나 코딩을 시도했을 때, 나는 끔찍한 결과를 낳았습니다. 분류기는 아무 것도 배우지 않았고 입력 값에 관계없이 같은 라벨을 뱉어 냈습니다.

내가 고려중인 두 번째 접근법은 신경망이지만 기능과 학습 데이터가 부족하다는 점을 감안할 때이 접근 방법의 실현 가능성에 대해서는 의심 스럽습니다.

요청한 경우, 내가 개발 한 SVC 코드를 scikit-learn과 공유 할 수 있습니다. 여기

내가 터미널에 덤프 한 내 데이터를 살펴입니다 :

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 일 것입니다. 여기서 클래스 당 포인트가 정규 분포를 따르고 있다고 가정합니다. . 결과가 N_SAMPLES_PER_CLASSSIGMA에 크게 의존 물론

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 

: 여기

, 일부 가짜 데이터를 구축을 분류하고 평가하는 코드이다.

편집 :

당신은 지금 당신의 데이터를 선물로, 내 가정이 보유하지 않는 것이 분명합니다. 이 코드에 의해 수행 다음 그래프 참조 (파일 []()에서 제거되었다, 사람들이 정말 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-ranges.

대부분의 예측에 대해 클래스 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 ' 이것은 LinearSVC에서 제공 한 것과 유사합니다. –

1

레이블 범위가 겹치지 않으면 ML 문제가 아닙니다. 간단한 목록 정렬 작업입니다. 실수로 데이터를 정렬하십시오. 레이블별로 그룹화하십시오. 각 라벨 내에서 최소값과 최대 값을 취하십시오. 너의 범위 야.

대신 파티션이 필요한 경우 실제 값의 순서대로 범위를 정렬하십시오. 인접한 클래스의 각 쌍에 대해 경계 값의 중앙값을 가져 와서 클래스 사이의 파티션을 만듭니다.

(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, 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) 

정렬 각 쌍의 첫 번째 값만큼 목록 (12 개)의 값 목록 주어진 예컨대

:

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

파티션 값을 원하면 경계 평균을 취하면 0.19와 0 값을 갖습니다. .32 클래스를 분리하십시오.

+0

사과드립니다. 나는 그들이 겹치지 않는다고 말하지는 않았다. 그들은 사실 그렇게합니다. 나는 그러나 레이블이 나타내는 최상의 독점적 인 범위를 찾고 싶었습니다 ... 희망을 명확히합니다! –