我已经预先清理了数据,下面显示了前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和fit/transform过程矢量化了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的数量,但无济于事,任何提示或建议将不胜感激。谢谢阅读。
------------------------------------------------- -------------------------------------------------- ---------------------------------
编辑:
Full Traceback
数据集/数据框(
df
)包含两列2380行,如上面的df.head()
所示。 X_train
以字符串列表(df['cleaned']
)的格式包含1785行,y_train
也包含字符串(df['Year']
)格式的1785行。使用
TfidfVectorizer()
进行后向量化:X_train
和X_test
分别从形状为((1785,)'和'(595,)'的pandas.core.series.Series
转换为形状为'(1785,126459)'和'(595,126459)'的scipy.sparse.csr.csr_matrix
。至于类的数量:使用
Counter()
,我计算出有199个类(年),每个类的实例都附加到上述df['cleaned']
数据的一个元素上,该数据包含从文本语料库中提取的字符串列表。此过程的目标是根据语音提示自动确定/猜测输入文本数据的年,十年或世纪(可以进行任何分类!)。
最佳答案
由于训练集中大约有200个类(class)和1800个样本,因此每个类(class)平均要有9个样本。出现此错误消息的原因是:a)数据可能不完全平衡,并且某些类的样本数少于6,并且b)邻居数为6。针对您的问题的一些解决方案:
n_neighbors
参数小于或等于n_samples。 ratio
类的SMOTE
参数以n_samples RandomOverSampler
类。 SMOTE
和RandomOversampler
的管道,该管道满足smoted类的条件n_neighbors <= n_samples,并在不满足条件时使用随机过采样。 关于scikit-learn - SMOTE初始化期望n_neighbors <= n_samples,但n_samples <n_neighbors,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49395939/