用于文本特征提取和評估的示例管道?

在本案例中使用的數據集是20個新聞組數據集,這些數據集將自動下載,然后緩存并重新用于文檔分類示例。

您可以通過將類別的名稱提供給數據集加載器或將其設置為None來獲得20個類別來調整類別的數量。

這是在四核計算機上運行的示例輸出:

Loading 20 newsgroups dataset for categories:
['alt.atheism''talk.religion.misc']
1427 documents
2 categories

Performing grid search...
pipeline: ['vect''tfidf''clf']
parameters:
{'clf__alpha': (1.0000000000000001e-059.9999999999999995e-07),
 'clf__max_iter': (105080),
 'clf__penalty': ('l2''elasticnet'),
 'tfidf__use_idf': (TrueFalse),
 'vect__max_n': (12),
 'vect__max_df': (0.50.751.0),
 'vect__max_features': (None50001000050000)}
done in 1737.030s

Best score: 0.940
Best parameters set:
    clf__alpha: 9.9999999999999995e-07
    clf__max_iter: 50
    clf__penalty: 'elasticnet'
    tfidf__use_idf: True
    vect__max_n: 2
    vect__max_df: 0.75
    vect__max_features: 50000

輸入:

# 作者: Olivier Grisel <olivier.grisel@ensta.org>
#      Peter Prettenhofer <peter.prettenhofer@gmail.com>
#      Mathieu Blondel <mathieu@mblondel.org>
# 執照: BSD 3 clause

from pprint import pprint
from time import time
import logging

from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.linear_model import SGDClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.pipeline import Pipeline

print(__doc__)

# 在標準輸出上顯示進度日志
logging.basicConfig(level=logging.INFO,
                    format='%(asctime)s %(levelname)s %(message)s')


# #############################################################################
# 從訓練集中導出兩個目錄
categories = [
    'alt.atheism',
    'talk.religion.misc',
]
# 取消注釋以下內容以對所有類別進行分析
# categories = None

print("Loading 20 newsgroups dataset for categories:")
print(categories)

data = fetch_20newsgroups(subset='train', categories=categories)
print("%d documents" % len(data.filenames))
print("%d categories" % len(data.target_names))
print()

# #############################################################################
# 定義結合了文本特征提取器和簡單分類器的管道
pipeline = Pipeline([
    ('vect', CountVectorizer()),
    ('tfidf', TfidfTransformer()),
    ('clf', SGDClassifier()),
])

# 如果取消注釋,我們可以搜索更多參數,提供更好的探索能力,但將以組合方式增加處理時間
parameters = {
    'vect__max_df': (0.50.751.0),
    # 'vect__max_features': (None, 5000, 10000, 50000),
    'vect__ngram_range': ((11), (12)),  # unigrams or bigrams
    # 'tfidf__use_idf': (True, False),
    # 'tfidf__norm': ('l1', 'l2'),
    'clf__max_iter': (20,),
    'clf__alpha': (0.000010.000001),
    'clf__penalty': ('l2''elasticnet'),
    # 'clf__max_iter': (10, 50, 80),
}

if __name__ == "__main__":
    # 多重處理要求分叉發生在受__main__保護的塊中
    # 查找特征提取和分類器的最佳參數
    grid_search = GridSearchCV(pipeline, parameters, n_jobs=-1, verbose=1)

    print("Performing grid search...")
    print("pipeline:", [name for name, _ in pipeline.steps])
    print("parameters:")
    pprint(parameters)
    t0 = time()
    grid_search.fit(data.data, data.target)
    print("done in %0.3fs" % (time() - t0))
    print()

    print("Best score: %0.3f" % grid_search.best_score_)
    print("Best parameters set:")
    best_parameters = grid_search.best_estimator_.get_params()
    for param_name in sorted(parameters.keys()):
        print("\t%s: %r" % (param_name,
                            best_parameters[param_name]))

腳本的總運行時間:(0分鐘0.000秒)