2014-01-26 2 views
2

Что я делаю?Обработка категориальных функций с использованием scikit-learn

Я решаю проблему классификации с использованием случайных лесов. У меня есть набор строк фиксированной длины (длиной 10 символов), которые представляют последовательности ДНК. Алфавит ДНК состоит из 4 букв, а именно A, C, G, T.

Вот пример из моих исходных данных:

ATGCTACTGA 
ACGTACTGAT 
AGCTATTGTA 
CGTGACTAGT 
TGACTATGAT 

Каждой последовательность ДНК поставляется с экспериментальными данными, описывающими реальную биологическую реакцию; было обнаружено, что молекула вызывает биологический ответ (1) или нет (0).

Проблема:

Обучающий набор состоит из обоих, категориальные (номинальные) и числовые характеристики. Он имеет следующую структуру:

training_set = [ 
    {'p1':'A', 'p2':'T', 'p3':'G', 'p4':'C', 'p5':'T', 
    'p6':'A', 'p7':'C', 'p8':'T', 'p9':'G', 'p10':'A', 
    'mass':370.2, 'temp':70.0}, 
    {'p1':'A', 'p2':'C', 'p3':'G', 'p4':'T', 'p5':'A', 
    'p6':'C', 'p7':'T', 'p8':'G', 'p9':'A', 'p10':'T', 
    'mass':400.3, 'temp':67.2}, 
] 

target = [1, 0] 

Я успешно создать классификатор с помощью DictVectorizer класс для кодирования номинальных функций, но у меня возникают проблемы при выполнении предсказания на моих тестовых данных.

Ниже упрощенная версия моего кода выполняется до сих пор:

from sklearn.ensemble import RandomForestClassifier 
from sklearn.feature_extraction import DictVectorizer 

training_set = [ 
    {'p1':'A', 'p2':'T', 'p3':'G', 'p4':'C', 'p5':'T', 
    'p6':'A', 'p7':'C', 'p8':'T', 'p9':'G', 'p10':'A', 
    'mass':370.2, 'temp':70.0}, 
    {'p1':'A', 'p2':'C', 'p3':'G', 'p4':'T', 'p5':'A', 
    'p6':'C', 'p7':'T', 'p8':'G', 'p9':'A', 'p10':'T', 
    'mass':400.3, 'temp':67.2}, 
] 

target = [1, 0] 

vec = DictVectorizer() 
train = vec.fit_transform(training_set).toarray() 

clf = RandomForestClassifier(n_estimators=1000) 
clf = clf.fit(train, target) 


# The following part fails. 
test_set = { 
    'p1':'A', 'p2':'T', 'p3':'G', 'p4':'C', 'p5':'T', 
    'p6':'A', 'p7':'C', 'p8':'T', 'p9':'G', 'p10':'A', 
    'mass':370.2, 'temp':70.0} 
vec = DictVectorizer() 
test = vec.fit_transform(test_set).toarray() 
print clf.predict_proba(test) 

В результате, я получил сообщение об ошибке:

ValueError: Number of features of the model must match the input. 
Model n_features is 20 and input n_features is 12 
+0

возможно duplica te [как заставить scikit-learn DictVectorizer не отбрасывать функции?] (http://stackoverflow.com/questions/19770147/how-to-force-scikit-learn-dictvectorizer-not-to-discard-features) –

ответ

3

Вы должны использовать один и тот же DictVectorizer объект, который создал поезд Набор данных для transformtest_set:

from sklearn.ensemble import RandomForestClassifier 
from sklearn.feature_extraction import DictVectorizer 

training_set = [ 
    {'p1':'A', 'p2':'T', 'p3':'G', 'p4':'C', 'p5':'T', 
    'p6':'A', 'p7':'C', 'p8':'T', 'p9':'G', 'p10':'A', 
    'mass':370.2, 'temp':70.0}, 
    {'p1':'A', 'p2':'C', 'p3':'G', 'p4':'T', 'p5':'A', 
    'p6':'C', 'p7':'T', 'p8':'G', 'p9':'A', 'p10':'T', 
    'mass':400.3, 'temp':67.2}, 
] 

target = [1, 0] 

vec = DictVectorizer() 
train = vec.fit_transform(training_set).toarray() 

clf = RandomForestClassifier(n_estimators=1000) 
clf = clf.fit(train, target) 


# The following part fails. 
test_set = { 
    'p1':'A', 'p2':'T', 'p3':'G', 'p4':'C', 'p5':'T', 
    'p6':'A', 'p7':'C', 'p8':'T', 'p9':'G', 'p10':'A', 
    'mass':370.2, 'temp':70.0} 

test = vec.transform(test_set).toarray() 
print clf.predict_proba(test) 
+0

Спасибо, он отлично работает. Тем не менее, я заметил, что работа с большим количеством строк делает результирующую матрицу очень широкой и перегружает мою память. Мне было интересно, если бы вы предложили мне другие способы создания классификаторов. В документации Scikit-learn я читал об [хэшировании функций] (http://scikit-learn.org/stable/modules/feature_extraction.html), но я не могу найти способ использовать его в своих данных. – sherlock85

+0

@s_sherly Чтобы сделать работу 'FeatureHasher', вам нужно самостоятельно заменить категориальные функции фиктивными переменными:' "p1 = A": 1' и т. Д. Но может быть лучше сделать выбор функции и/или уменьшить размер с помощью 'TruncatedSVD' на разреженной матрице, которая выходит из вектора. –