【问题标题】:Logistic regression in Python: GridSearchCV not workingPython 中的逻辑回归:GridSearchCV 不起作用
【发布时间】:2022-01-15 11:06:36
【问题描述】:

我对数据挖掘,尤其是文本分析有点陌生。我正在我的数据集上训练一个逻辑回归模型,并且我试图获得尽可能好的准确度,至少在 0.6 左右。但我似乎不能超过 0,5。 这是我的数据集:

df = pd.read_csv('https://raw.githubusercontent.com/cpedroni/DMML2021_Microsoft/main/data/training_data.csv')
df_pred = pd.read_csv('https://raw.githubusercontent.com/cpedroni/DMML2021_Microsoft/main/data/unlabelled_test_data.csv')

我使用带有 tfidf 的管道训练了我的模型:

tfidf_params = dict(sublinear_tf= True, 
                       min_df = 4, 
                       norm= 'l2', 
                       ngram_range= (1,4),
                       tokenizer= word_tokenize)

clf = Pipeline(steps=[
('features', TfidfVectorizer(**tfidf_params)),
('model', LogisticRegression(random_state=0, solver='lbfgs', max_iter=300))
])

clf.fit(X_train, y_train)

y_pred = clf.predict(X_test)
def metrics(y_test, y_pred):
  precision = precision_score(y_test, y_pred, average=None)
  recall = recall_score(y_test, y_pred, average=None)
  f1 = f1_score(y_test, y_pred, average=None)
  print("Precision: " + str(precision_score(y_test, y_pred, average='micro')))
  print("Recall: " + str(recall_score(y_test, y_pred, average='micro')))
  print("F1: " + str(2 * (precision * recall) / (precision + recall)))
  print("Accuracy: " + str(accuracy_score(y_test, y_pred)))

metrics(y_test, y_pred)

我得到了0.471875的准确度分数,但我想让它更高,所以尝试像这样进行网格搜索:

from sklearn.model_selection import GridSearchCV
param_grid_lr = {
    'max_iter': [20, 50, 100, 200, 500, 1000],                      
    'solver': ['newton-cg', 'lbfgs', 'liblinear', 'sag', 'saga'],   
    'class_weight': ['balanced']                                    
}

logModel_grid = GridSearchCV(estimator=LogisticRegression(random_state=1234), param_grid=param_grid_lr, verbose=1, cv=10, n_jobs=-1)
logModel_grid.fit(X_train, y_train)
print(logModel_grid.best_estimator_)

但是我得到了这个我不明白的错误:ValueError: could not convert string to float。我收到此行logModel_grid.fit(X_train, y_train) 的此错误,但在进行网格搜索之前我没有收到日志模型的此错误。你知道为什么GridSearchCV 会带来这个错误吗?

【问题讨论】:

    标签: python logistic-regression data-mining hyperparameters tfidfvectorizer


    【解决方案1】:

    您需要在估算器中包含矢量化器。

    假设你是这样处理的:

    from sklearn.model_selection import train_test_split, GridSearchCV
    from nltk.tokenize import word_tokenize
    from sklearn.pipeline import Pipeline
    from sklearn.feature_extraction.text import TfidfVectorizer
    from sklearn.linear_model import LogisticRegression
    
    df = pd.read_csv('https://raw.githubusercontent.com/cpedroni/DMML2021_Microsoft/main/data/training_data.csv')
    X_train, X_test, y_train, y_test = train_test_split(df['sentence'],df['difficulty'],
                                                        test_size=0.2, random_state=30, stratify=df['difficulty'])
    

    我们像您的第一部分一样使用管道:

    tfidf_params = dict(sublinear_tf= True, 
                           min_df = 4, 
                           norm= 'l2', 
                           ngram_range= (1,4),
                           tokenizer= word_tokenize)
    
    pipe = Pipeline(steps=[
    ('features', TfidfVectorizer(**tfidf_params)),
    ('model', LogisticRegression())
    ])
    

    定义参数,而不是下划线:

    param_grid_lr = {
        'model__max_iter': [20, 50],                      
        'model__solver': ['newton-cg', 'lbfgs'],   
        'model__class_weight': ['balanced']                                    
    }
    

    适合:

    logModel_grid = GridSearchCV(pipe, param_grid=param_grid_lr, verbose=1, cv=10, n_jobs=-1)
    logModel_grid.fit(X_train, y_train)
    

    【讨论】:

    • 你可以看到哪些参数给你一个更好的分数。抱歉没有完全明白你的问题
    • 有效!我不再有错误,但是我得到了与以前相同的准确度分数。有没有办法提高这个分数?
    • 不,我把它作为输出Fitting 10 folds for each of 4 candidates, totalling 40 fits Precision: 0.471875 Recall: 0.471875 F1: [0.57225434 0.4248366 0.4495114 0.42038217 0.42767296 0.52279635] Accuracy: 0.471875
    • 我不认为这是模型。可能是您必须调整矢量化器,基本上是您的输入。抱歉,我不熟悉你的数据,这不是你问的问题
    猜你喜欢
    • 2022-01-12
    • 2017-09-01
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    • 2016-12-01
    • 1970-01-01
    相关资源
    最近更新 更多