我在这里做错了什么?我有一个大型数据集,我想使用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时传递类。
答案 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))