2014-12-06 208 views
2

我想對Sci Kit Learn中的unigrams做一些分析。我創建了svmlight格式的文件並試圖運行MultinomialNB() KNeighborsClassifier() and SVC()。我們首先試圖用unigrams做到這一點,但我得到了X培訓維度錯誤,可能是因爲在給定示例中包含的唯一unigrams是在那裏的培訓中出現的唯一unigrams。我試圖創建svmlight格式的培訓文件,其中包括每個在語料庫中查看的每個單元的佔位符,即使那些不在該給出的示例中。用Scikit學習Unigram分析

問題是將訓練文件從3 MB擴大到300 MB。這導致sklearn加載文件的內存錯誤。有沒有辦法繞過維度不匹配或內存溢出。

X_train, y_train= load_svmlight_file(trainFile) 
x_test, y_test = load_svmlight_file(testFile) 
try: 
    clf = MultinomialNB() 
    clf.fit(X_train, y_train) 
    preds = clf.predict(x_test) 
    print('Input data: ' + trainFile.split('.')[0]) 
    print('naive_bayes') 
    print('accuracy: ' + str(accuracy_score(y_test, preds))) 
    if 1 in preds: 
     print('precision: ' + str(precision_score(y_test, preds))) 
     print('recall: ' + str(recall_score(y_test, preds))) 
except Exception as inst: 
    print 'fail in NB ' + 'Input data: ' + trainFile.split('.')[0] 
    print str(inst) 
    pass 

2828測試實例,並與18000個不同unigram進行

編輯1212個測試的例子,我試圖用sklearn CountVectorizer但我仍然得到內存的問題。這是做這件事的最好方法嗎?

def fileLoadForPipeline(trainSetFile, valSetFile): 
    with open(trainSetFile) as json_file: 
    tdata = json.load(json_file) 
with open(valSetFile) as json_file: 
    vdata = json.load(json_file) 
x_train = [] 
x_val = [] 
y_train = [] 
y_val = [] 
for t in tdata: 
    x_train.append(t['request_text']) 
    y_train.append(t['requester_received_pizza']) 
for v in vdata: 
    x_val.append(t['request_text']) 
    y_val.append(t['requester_received_pizza']) 
return x_train, y_train, x_val, y_val 

def buildPipeline(trainset, valset, norm): 
x_train, y_train, x_val, y_val = fileLoadForPipeline(trainset, valset) 
bigram_vectorizer = CountVectorizer(ngram_range=(1, 2), token_pattern=ur'\b\w+\b', min_df=1) 
xT = bigram_vectorizer.fit_transform(x_train).toarray() 
xV = bigram_vectorizer.fit_transform(x_val).toarray() 
if norm: 
    transformer = TfidfTransformer() 
    xT = transformer.fit_transform(xT) 
    xV = transformer.fit_transform(xV) 
results = [] 
for clf, name in ((Perceptron(n_iter=50), "Perceptron"), 
       (KNeighborsClassifier(n_neighbors=40), "kNN"), (MultinomialNB), (MultinomialNB(alpha=.01),'MultinomialNB'), 
       (BernoulliNB(alpha=.1),'BernoulliNB'),(svm.SVC(class_weight='auto'),'svc')): 
    print 80 * '=' 
    print name 
    results.append(benchmark(clf)) 
+0

你可以發佈X_train,y_train,x_test和y_test的長度和尺寸以及你得到的錯誤嗎? – user823743 2014-12-07 01:23:20

+0

@ user823743添加了 – 2014-12-07 01:28:17

+0

我的意思是如果您可以在代碼中打印尺寸並將其張貼在這裏?或者在分配這些數組時遇到錯誤?和控制檯上的錯誤是什麼? – user823743 2014-12-07 01:34:36

回答

1

嘗試使用scikit學習的CountVectorizer將做原始文本適合你的特徵提取。最重要的是,調用一組訓練樣例的方法fit_transform將自動執行單詞袋單元格轉換,其中它跟蹤在訓練語料庫中找到的所有唯一字,並將每個文檔轉換爲長度爲n的數組,其特徵爲其特徵可以是離散字數或二進制存在功能(取決於binary選項)。關於CountVectorizer的好處在於它以numpy稀疏矩陣格式存儲數據,這使得它非常有效,並且應該能夠解決您遇到的任何內存問題。

然後您可以在未來的測試示例中調用transform,並且它會像正常一樣進行轉換。

這也應該有助於解決任何維度問題,因爲CountVectorizer的工作是規範一切。這裏使用的具體信息:

http://scikit-learn.org/stable/modules/feature_extraction.html#common-vectorizer-usage

一個額外的這樣的好處是,你可以在這個矢量化與分類使用Pipeline進行裝配和測試更方便結合起來。

+0

我試過這個,試圖在上面的代碼中修復它。我做對了嗎? – 2014-12-08 08:15:12