簡體   English   中英

scikit學習邏輯回歸模型tfidfvectorizer

[英]scikit learn logistic regression model tfidfvectorizer

我正在嘗試使用scikit Learn和以下代碼創建邏輯回歸模型。 我將9列用於要素(X),將1列用於標簽(Y)。 嘗試擬合時,即使先前使用X.transpose(),如果X和Y的長度相同,則也會收到錯誤消息“ ValueError:找到的輸入變量樣本數量不一致:[9,560000]”,但我得到一個不同的錯誤“ 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)  

您嘗試做的事情很不尋常,因為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,端口) 編碼為數值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM