#python #pandas #scikit-learn #categorical-data #feature-selection
Вопрос:
Я пытаюсь выполнить выбор функций для категориальных значений, используя взаимную информацию. Я продолжаю получать ошибку, и я не совсем уверен, как ее исправить. Ошибка, которую я получаю, заключается в обнаружении неизвестных категорий [‘3’] в столбце 29 во время преобразования.
from pandas import read_csv
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OrdinalEncoder
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import mutual_info_classif
from matplotlib import pyplot
from sklearn.preprocessing import OneHotEncoder
# load the dataset
def load_dataset(filename):
data = read_csv(filename, header=None)
dataset = data.values
X = dataset[:, :-1]
y = dataset[:,-1]
return X, y
# prepare input data
def prepare_inputs(X_train, X_test):
oe = OrdinalEncoder()
oe.fit(X_train)
X_train_enc = oe.transform(X_train)
X_test_enc = oe.transform(X_test)
return X_train_enc, X_test_enc
# prepare target
def prepare_targets(y_train, y_test):
le = LabelEncoder()
le.fit(y_train)
y_train_enc = le.transform(y_train)
y_test_enc = le.transform(y_test)
return y_train_enc, y_test_enc
# feature selection
def select_features(X_train, y_train, X_test):
fs = SelectKBest(score_func=mutual_info_classif, k='all')
fs.fit(X_train, y_train)
X_train_fs = fs.transform(X_train)
X_test_fs = fs.transform(X_test)
return X_train_fs, X_test_fs, fs
# load the dataset
X, y = load_dataset('DataUF31New.csv')
# split into train and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=1)
# prepare input data
X_train_enc, X_test_enc = prepare_inputs(X_train, X_test)
# prepare output data
y_train_enc, y_test_enc = prepare_targets(y_train, y_test)
# feature selection
X_train_fs, X_test_fs, fs = select_features(X_train_enc, y_train_enc, X_test_enc)
# what are scores for the features
for i in range(len(fs.scores_)):
print('Feature %d: %f' % (i, fs.scores_[i]))
# plot the scores
pyplot.bar([i for i in range(len(fs.scores_))], fs.scores_)
pyplot.show()
Комментарии:
1. репликация невозможна, если вы не включите часть своего набора данных. кроме
transform
того, в вашем коде есть 6 строк с. Не могли бы вы включить обратную трассировку, чтобы можно было увидеть, где она дает сбой?