2017-02-09 4 views
3

Что я здесь делаю неправильно? У меня есть большой набор данных, который я хочу, чтобы выполнить частичное прилегание на использовании Scikit учиться-х SGDClassifierSKlearn SGD Partial Fit

я делаю следующее

from sklearn.linear_model import SGDClassifier 
import pandas as pd 

chunksize = 5 
clf2 = SGDClassifier(loss='log', penalty="l2") 

for train_df in pd.read_csv("train.csv", chunksize=chunksize, iterator=True): 
    X = train_df[features_columns] 
    Y = train_df["clicked"] 
    clf2.partial_fit(X, Y) 

Я получаю ошибку

Traceback (most recent call last): File "/predict.py", line 48, in sys.exit(0 if main() else 1) File "/predict.py", line 44, in main predict() File "/predict.py", line 38, in predict clf2.partial_fit(X, Y) File "/Users/anaconda/lib/python3.5/site-packages/sklearn/linear_model/stochastic_gradient.py", line 512, in partial_fit coef_init=None, intercept_init=None) File "/Users/anaconda/lib/python3.5/site-packages/sklearn/linear_model/stochastic_gradient.py", line 349, in _partial_fit _check_partial_fit_first_call(self, classes) File "/Users/anaconda/lib/python3.5/site-packages/sklearn/utils/multiclass.py", line 297, in _check_partial_fit_first_call raise ValueError("classes must be passed on the first call " ValueError: classes must be passed on the first call to partial_fit.

+1

«Классы по всем вызовам partial_fit. Может быть получен через np.unique (y_all), где y_all является целевым вектором всего набора данных. Этот аргумент требуется для первого вызова partial_fit и может быть опущен в последующие вызовы. Обратите внимание, что y не обязательно должно содержать все метки в классах ». http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.SGDClassifier.html#sklearn.linear_model.SGDClassifier.partial_fit –

+1

@JackManey Пожалуйста, разместите свой комментарий в качестве ответа, чтобы он мог принять и/или закрыть вопрос. –

ответ

2

Пожалуйста, обратите внимание что классификатор не знает количества классов в начале, поэтому для первого прохода вам нужно указать количество классов, используя np.unique (target), где target - столбец класса. Поскольку вы читаете данные в кусках, вам нужно убедиться, что ваш первый кусок имеет все возможные значения для метки класса, поэтому он работает! Таким образом, ваш код будет:

for train_df in pd.read_csv("train.csv", chunksize=chunksize, iterator=True): 
    X = train_df[features_columns] 
    Y = train_df["clicked"] 
    clf2.partial_fit(X, Y, classes=np.unique(Y)) 
0

http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.SGDClassifier.html#sklearn.linear_model.SGDClassifier.partial_fit

clf2.partial_fit(X, Y, classes=np.unique(Y)) 

Предположим, что у вас нет достаточной записи класса и поэтому классификаторов значения нуждаются в общем количестве классов, которые должны быть классифицированы.