SKlearn SGD Partial Fit

时间:2017-02-09 21:33:59

标签: python scikit-learn

我在这里做错了什么?我有一个大型数据集,我想使用Scikit-learn的SGDClassifier进行部分拟合

我做以下

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(最近一次调用最后一次):文件“/predict.py”,第48行,in          sys.exit(0如果main()else 1)文件“/predict.py”,第44行,在main中       predict()文件“/predict.py”,第38行,在预测中       clf2.partial_fit(X,Y)文件“/Users/anaconda/lib/python3.5/site-packages/sklearn/linear_model/stochastic_gradient.py”,   第512行,在partial_fit中       coef_init = None,intercept_init = None)文件“/Users/anaconda/lib/python3.5/site-packages/sklearn/linear_model/stochastic_gradient.py”,   第349行,在_partial_fit中       _check_partial_fit_first_call(self,classes)文件“/Users/anaconda/lib/python3.5/site-packages/sklearn/utils/multiclass.py”,   第297行,在_check_partial_fit_first_call中       提高ValueError(“必须在第一次调用时传递类”ValueError:必须在第一次调用partial_fit时传递类。

1 个答案:

答案 0 :(得分:5)

请注意,分类器在开头并不知道类的数量,因此对于第一遍,您需要使用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))