我已经预先清理了数据,以下显示前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
以字符串列表的格式(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']
数据中的一个元素相关联。
该过程的目的是根据存在的词汇自动确定/猜测输入文本数据的年份、十年或世纪(任何分类程度都可以!)。
X_train
中增加更多的样本(行)。 - MaxU - stand with Ukraine