scikit учат модель логистической регрессии tfidfvectorizer - PullRequest
0 голосов
/ 01 сентября 2018

Я пытаюсь создать модель логистической регрессии, используя scikit learn с кодом ниже. Я использую 9 столбцов для объектов (X) и один для метки (Y). При попытке подгонки я получаю сообщение об ошибке «ValueError: Найдены входные переменные с непоследовательным количеством выборок: [9, 560000]», хотя ранее длины X и Y были одинаковыми, если я использую x.transpose (), я получаю другая ошибка "AttributeError: объект 'int' не имеет атрибута 'lower'". Я предполагаю, что это возможно связано с tfidfvectorizer, я делаю это потому, что 3 столбца содержат отдельные слова и не работают. Это правильный способ сделать это, или я должен конвертировать слова в столбцах отдельно и затем использовать train_test_split? Если нет, то почему я получаю ошибки и как их исправить. Вот пример csv .

df = pd.read_csv("UNSW-NB15_1.csv",header=None, names=cols, encoding = "UTF-8",low_memory=False) 

df.to_csv('netraf.csv')
csv = 'netraf.csv'
my_df = pd.read_csv(csv)

x_features = my_df.columns[1:10]
x_data = my_df[x_features]
Y = my_df["Label"]

x_train, x_validation, y_train, y_validation = 
model_selection.train_test_split(x_data, Y, test_size=0.2, random_state=7)

tfidf_vectorizer = TfidfVectorizer()
lr = LogisticRegression()
tfidf_lr_pipe = Pipeline([('tfidf', tfidf_vectorizer), ('lr', lr)])

tfidf_lr_pipe.fit(x_train, y_train)  

1 Ответ

0 голосов
/ 03 сентября 2018

То, что вы пытаетесь сделать, необычно, потому что TfidfVectorizer предназначен для извлечения числовых функций из текста. Но если вас это не волнует, и вы просто хотите, чтобы ваш код работал, один из способов сделать это - преобразовать ваши числовые данные в строку и настроить TfidfVectorizer для приема токенизированных данных:

import pandas as pd
from sklearn import model_selection
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline

cols = ['srcip','sport','dstip','dsport','proto','service','smeansz','dmeansz','attack_cat','Label']
df = pd.read_csv("UNSW-NB15_1.csv",header=None, names=cols, encoding = "UTF-8",low_memory=False) 

df.to_csv('netraf.csv')
csv = 'netraf.csv'
my_df = pd.read_csv(csv)

# convert all columns to string like we don't care
for col in my_df.columns:
    my_df[col] = my_df[col].astype(str)

# replace nan with empty string like we don't care
for col in my_df.columns[my_df.isna().any()].tolist():
    my_df.loc[:, col].fillna('', inplace=True)

x_features = my_df.columns[1:10]
x_data = my_df[x_features]
Y = my_df["Label"]

x_train, x_validation, y_train, y_validation = model_selection.train_test_split(
    x_data.values, Y.values, test_size=0.2, random_state=7)

# configure TfidfVectorizer to accept tokenized data
# reference http://www.davidsbatista.net/blog/2018/02/28/TfidfVectorizer/
tfidf_vectorizer = TfidfVectorizer(
    analyzer='word',
    tokenizer=lambda x: x,
    preprocessor=lambda x: x,
    token_pattern=None)

lr = LogisticRegression()
tfidf_lr_pipe = Pipeline([('tfidf', tfidf_vectorizer), ('lr', lr)])
tfidf_lr_pipe.fit(x_train, y_train)

При этом я бы порекомендовал вам использовать другой метод для разработки функций в вашем наборе данных. Например, вы можете попробовать для кодирования ваших номинальных данных (например, IP, порт) в числовое значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...