Изоляционный лес: категориальные данные - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь обнаружить аномалии в наборе данных по раку молочной железы с помощью Isolation Forest в sklearn.Я пытаюсь применить Iolation Forest к смешанному набору данных, и он дает мне ошибки в значениях, когда я подгоняю модель.

Это мой набор данных: https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer/

Это мой код:

from sklearn.model_selection import train_test_split
rng = np.random.RandomState(42)

X = data_cancer.drop(['Class'],axis=1)
y = data_cancer['Class'] 

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 20)
X_outliers = rng.uniform(low=-4, high=4, size=(X.shape[0], X.shape[1]))

clf = IsolationForest()
clf.fit(X_train)

Это ошибка, которую я получаю:

ValueError: не удалось преобразовать строку в число с плавающей точкой: '30 -39 '

Можно ли использовать Isolation Forest для категориальных данных?Если да, то как мне это сделать?

1 Ответ

0 голосов
/ 26 февраля 2019

Вы должны закодировать ваши категориальные данные в числовое представление.

Существует много способов кодирования категориальных данных, но я предлагаю вам начать с

sklearn.preprocessing.LabelEncoder, если количество элементов велико и sklearn.preprocessing.OneHotEncoder если количество элементов низкое.

Вот пример использования:

from numpy import argmax
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OneHotEncoder
# define example
data = ['cold', 'cold', 'warm', 'cold', 'hot', 'hot', 'warm', 'cold', 'warm', 'hot']
values = array(data)
print(values)
# integer encode
label_encoder = LabelEncoder()
integer_encoded = label_encoder.fit_transform(values)
print(integer_encoded)
# binary encode
onehot_encoder = OneHotEncoder(sparse=False)
integer_encoded = integer_encoded.reshape(len(integer_encoded), 1)
onehot_encoded = onehot_encoder.fit_transform(integer_encoded)
print(onehot_encoded)
# invert first example
inverted = label_encoder.inverse_transform([argmax(onehot_encoded[0, :])])
print(inverted

)

Вывод:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
['cold' 'cold' 'warm' 'cold' 'hot' 'hot' 'warm' 'cold' 'warm' 'hot']

[0 0 2 0 1 1 2 0 2 1]

[[ 1.  0.  0.]
 [ 1.  0.  0.]
 [ 0.  0.  1.]
 [ 1.  0.  0.]
 [ 0.  1.  0.]
 [ 0.  1.  0.]
 [ 0.  0.  1.]
 [ 1.  0.  0.]
 [ 0.  0.  1.]
 [ 0.  1.  0.]]

['cold']
...