【发布时间】:2018-08-29 23:01:37
【问题描述】:
我已经对数据进行了预清理,下面是前4行的格式:
[IN] df.head()
[OUT] Year cleaned
0 1909 acquaint hous receiv follow letter clerk crown...
1 1909 ask secretari state war whether issu statement...
2 1909 i beg present petit sign upward motor car driv...
3 1909 i desir ask secretari state war second lieuten...
4 1909 ask secretari state war whether would introduc...
我调用了 train_test_split() 如下:
[IN] X_train, X_test, y_train, y_test = train_test_split(df['cleaned'], df['Year'], random_state=2)
[Note*] `X_train` and `y_train` are now Pandas.core.series.Series of shape (1785,) and `X_test` and `y_test` are also Pandas.core.series.Series of shape (595,)
然后,我使用以下 TfidfVectorizer 和拟合/转换过程对 X 训练和测试数据进行了矢量化处理:
[IN] v = TfidfVectorizer(decode_error='replace', encoding='utf-8', stop_words='english', ngram_range=(1, 1), sublinear_tf=True)
X_train = v.fit_transform(X_train)
X_test = v.transform(X_test)
我现在处于通常应用分类器等的阶段(如果这是一组平衡的数据)。但是,我初始化了 imblearn 的 SMOTE() 类(以执行过采样)...
[IN] smote_pipeline = make_pipeline_imb(SMOTE(), classifier(random_state=42))
smote_model = smote_pipeline.fit(X_train, y_train)
smote_prediction = smote_model.predict(X_test)
...但这会导致:
[OUT] ValueError: "Expected n_neighbors <= n_samples, but n_samples = 5, n_neighbors = 6.
我试图减少 n_neighbors 的数量,但无济于事,任何提示或建议将不胜感激。感谢阅读。
------------------------------------------ -------------------------------------------------- --------------------------------------
编辑:
数据集/数据框 (df) 包含跨两列的 2380 行,如上面的df.head() 所示。 X_train 包含 1785 个字符串列表格式的行 (df['cleaned']),y_train 还包含 1785 个字符串格式的行 (df['Year'])。
使用TfidfVectorizer() 进行后矢量化:X_train 和 X_test 分别从形状为“(1785,)”和“(595,)”的pandas.core.series.Series 转换为形状为“(1785) 的scipy.sparse.csr.csr_matrix , 126459)' 和 '(595, 126459)'。
至于类的数量:使用Counter(),我计算出有199个类(年),一个类的每个实例都附加到上述df['cleaned']数据的一个元素上,其中包含一个字符串列表从文本语料库中提取。
此过程的目标是根据出现的词汇自动确定/猜测输入文本数据的年份、十年或世纪(任何程度的分类都可以!)。
【问题讨论】:
-
错误信息是不言自明的,不是吗?我猜您的
X_train中需要更多样本(行) -
请添加错误的完整堆栈跟踪。
-
另外请告诉我们你的班级不平衡。有多少类,每个类有多少样本?
-
感谢大家的回复,我已尽力在对原始帖子的编辑中解决您的问题。如果有什么我可以纠正的,请告诉我!
标签: scikit-learn knn tf-idf oversampling imblearn