Вот как выглядят мои данные:
data data
Это набор данных электронной почты. Мне нужно классифицировать каждый в разные классы. Столбец темы - это класс, а столбец y - это метка. Теперь я обучил логистической регрессии, чтобы получить это. Вот как выглядит мой код:
def fit(df, training_size, X_train):
models = {}
filtered_folders = []
unique_folders = df["y"].unique()
for folder in unique_folders:
model = LogisticRegression()
y_train = df[:training_size]["y"] == folder
try:
model.fit(X_train, y_train)
models[folder] = model
filtered_folders.append(folder)
except:
pass
return models, filtered_folders
папки здесь означают темы. Я уже предварительно обработал свои данные и разделился на обучение и тестирование. Чтобы подготовить особенности моих данных, вот что я использовал:
def prepare_features(df):
from_bag = assemble_bag(df["sender"])
to_bag = assemble_bag(df["recipient"])
message_bag = assemble_bag(df["body"])
subject_bag = assemble_bag(df["subject"])
frames = [from_bag, subject_bag, to_bag, message_bag]
X = pd.concat(frames, axis = 1, join = 'inner')
#X.drop(labels = [" ", ""], inplace = True, axis = 1)
return X
Вот процесс, который принимает assembly_bag:
- Он токенизирует данные.
- Удаляет стоп-слова
- Удаляет регулярные выражения
- Создает пакет слов
Эта модель работает отлично. Это дает точность 74%. Проблема в том, что когда я даю ему один экземпляр ввода, например: отправитель = отправитель, получатель = получатель, сообщение = сообщение, тема = тема, он генерирует следующую ошибку:
ValueError Traceback (most recent call last)
<ipython-input-45-cdd528359822> in <module>()
11 X_test = prepare_features1(Y)
12 print X_test
---> 13 y_test_pred = predict(X_test, loaded_model, filtered_folders)
<ipython-input-25-dccf241fdc59> in predict(X_test, models, filtered_folders)
3 for folder in filtered_folders:
4 # Compute probability
----> 5 testing_probs[folder] = models[folder].predict_proba(X_test)[:,1]
6 y_test_pred = testing_probs.idxmax(axis = 1)
7 return y_test_pred
C:\Users\fatima.arshad\AppData\Local\Continuum\anaconda2\lib\site-packages\sklearn\linear_model\logistic.pyc in predict_proba(self, X)
1409 self.solver == 'liblinear')))
1410 if ovr:
-> 1411 return super(LogisticRegression, self)._predict_proba_lr(X)
1412 else:
1413 decision = self.decision_function(X)
C:\Users\fatima.arshad\AppData\Local\Continuum\anaconda2\lib\site-packages\sklearn\linear_model\base.pyc in _predict_proba_lr(self, X)
293 multiclass is handled by normalizing that over all classes.
294 """
--> 295 prob = self.decision_function(X)
296 prob *= -1
297 np.exp(prob, prob)
C:\Users\fatima.arshad\AppData\Local\Continuum\anaconda2\lib\site-packages\sklearn\linear_model\base.pyc in decision_function(self, X)
260 if X.shape[1] != n_features:
261 raise ValueError("X has %d features per sample; expecting %d"
--> 262 % (X.shape[1], n_features))
263
264 scores = safe_sparse_dot(X, self.coef_.T,
ValueError: X has 6 features per sample; expecting 17522
Пример ввода, которыйЯ просто дал пройти через тот же конвейер. Я создаю его функции с помощью preparefeatures (), а затем пропускаю его через n моделей.
Вот как выглядит мой ввод:
Y = ['sender', 'rcvr','subjectheheh', 'message']
X_test = prepare_features1(Y)
print X_test
y_test_pred = predict(X_test, loaded_model, filtered_folders)