как преобразовать тестовые данные, чтобы выбрать те же функции, что и в учебном наборе данных - PullRequest
0 голосов
/ 23 января 2020

просто, я пытаюсь применить тот же выбор объектов для проверки данных, что и для обучения набора, однако тест не имеет такой же точной формы.

def get_important_features (X_train, Y_train, X_test):
    '''

    :param X_train: features of training set of type scipy.sparse.csr_matrix
    :param Y_train: labels of training set of type scipy.sparse.csr_matrix
    :param X_test: features of test set of type scipy.sparse.csr_matrix
    :return: 
    '''
    select_percentile = SelectPercentile(chi2, percentile=75)

    print(X_train.shape)
    print(X_test.shape)
    X_new_train = select_percentile.fit_transform(X_train, Y_train)
    #print(select_percentile.get_support(indices=True))
    X_new_test = select_percentile.transform(X_test)
    return X_new_train,  X_new_test

, поэтому форма обучающего набора (836, 3188) и форма набора тестов (633, 3187), как вы можете видеть, набор тестов не имеет форму, аналогичную обучающему набору, однако все, что мне нужно, это выбирать только те функции, которые существуют в обучающем наборе после применения chi2. Кроме того, как вы, возможно, знаете, X_new_test = select_percentile.transform(X_test) ошибка значения throw ValueError: X has a different shape than during fitting. по причине, указанной выше. Можно ли как-нибудь извлечь эти характеристики из X_test без использования transform(X_test)?

Примечание: что входные данные являются матрицей csr, а не кадром данных, поэтому я получаю эти значения из документа формата libsvm.

 train= load_svmlight_file(train_file_name)
 X_train = train[0]
 Y_train = train[1]
 test= load_svmlight_file(test_file_name)
 X_test = test[0]
 Y_test = test[1]

1 Ответ

0 голосов
/ 23 января 2020

Я пробовал с вашей функцией, и она работает. Убедитесь, что вы передаете данные правильно. Ниже приведен минимальный пример для вашей справки:

from sklearn.feature_selection import SelectPercentile
from sklearn.feature_selection import chi2

# dummy data
train = pd.DataFrame(np.random.randint(1000, size=(50, 10)), columns=['A'+str(x) for x in range(10)])
test = pd.DataFrame(np.random.randint(1000, size=(30, 9)), columns=['A'+str(x) for x in range(9)])

# assuming the last column is the target variable
X_new_train,  X_new_test = get_important_features(train.iloc[:,:-1], train.iloc[:,-1], test)

print(X_new_train.shape,  X_new_test.shape)
(50, 6) (30, 6)
...