SMOTE 初始化期望 n_neighbors <= n_samples,但 n_samples < n_neighbors
SMOTE initialisation expects n_neighbors <= n_samples, but n_samples < n_neighbors
我已经预先清理了数据,下面显示了前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)
我现在正处于通常应用 classifier 等的阶段(如果这是一组平衡的数据)。但是,我初始化了 imblearn 的 SMOTE() class(以执行过采样)...
[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
dataset/dataframe (df
) 包含两列 2380 行,如上文 df.head()
所示。 X_train
包含 1785 行,格式为字符串列表 (df['cleaned']
),y_train
也包含 1785 行,格式为字符串 (df['Year']
)。
Post-使用 TfidfVectorizer()
的向量化:X_train
和 X_test
是从 pandas.core.series.Series
形状 '(1785,)' 和 '(595 ,)' 分别为 scipy.sparse.csr.csr_matrix
的形状 '(1785, 126459)' 和 '(595, 126459)'。
至于classes的数量:使用Counter()
,我计算出有199 classes(年),每个实例一个class 附加到上述 df['cleaned']
数据的一个元素,该数据包含从文本语料库中提取的字符串列表。
这个过程的objective是自动determine/guess输入文本数据的年份、十年或世纪(任何程度的class化都可以!) .
由于训练集中大约有 200 classes 和 1800 个样本,因此每个 class 平均有 9 个样本。错误消息的原因是 a) 可能数据不完全平衡并且有 classes 少于 6 个样本和 b) 邻居的数量是 6。您的问题的一些解决方案:
计算SMOTEclass的199个classes和selectn_neighbors
参数中的最小样本数(n_samples)class 小于或等于 n_samples.
使用 SMOTE
class 的 ratio
参数排除 n_samples < n_neighbors 的 classes ].
使用没有类似限制的RandomOverSampler
class
组合 3 和 4 解决方案:创建一个使用 SMOTE
和 RandomOversampler
的管道,以满足条件 n_neighbors <= n_samples for smoted classes 并在不满足条件时使用随机过采样。
尝试为 SMOTE 执行以下代码
oversampler=SMOTE(kind='regular',k_neighbors=2)
这对我有用。
我认为可以使用代码:
sampler = SMOTE(ratio={1: 1927, 0: 300},random_state=0)
为什么会发生:
在我的例子中,它的发生是因为我的一些 values/categories 样本只有 1 个。由于 SMOTE 基于 KNN 概念,因此无法将 SMOTE 应用于 1 个采样值。
我是如何解决的:
Since those 1 sampled values/categories were equivalent to outliers, i removed them from the dataset and then applied SMOTE and it worked.
Also try decreasing the k_neighbors
parameter to make it work
xr, yr = SMOTE(k_neighbors=3).fit_resample(x, y)
当类别中的样本数量非常少(小于 k_neighbors
参数)时会发生这种情况。
您可以通过将这些值称为离群值来移除这些值,或者更改 k_neighbors
参数作为解决方案。
我已经预先清理了数据,下面显示了前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)
我现在正处于通常应用 classifier 等的阶段(如果这是一组平衡的数据)。但是,我初始化了 imblearn 的 SMOTE() class(以执行过采样)...
[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
dataset/dataframe (df
) 包含两列 2380 行,如上文 df.head()
所示。 X_train
包含 1785 行,格式为字符串列表 (df['cleaned']
),y_train
也包含 1785 行,格式为字符串 (df['Year']
)。
Post-使用 TfidfVectorizer()
的向量化:X_train
和 X_test
是从 pandas.core.series.Series
形状 '(1785,)' 和 '(595 ,)' 分别为 scipy.sparse.csr.csr_matrix
的形状 '(1785, 126459)' 和 '(595, 126459)'。
至于classes的数量:使用Counter()
,我计算出有199 classes(年),每个实例一个class 附加到上述 df['cleaned']
数据的一个元素,该数据包含从文本语料库中提取的字符串列表。
这个过程的objective是自动determine/guess输入文本数据的年份、十年或世纪(任何程度的class化都可以!) .
由于训练集中大约有 200 classes 和 1800 个样本,因此每个 class 平均有 9 个样本。错误消息的原因是 a) 可能数据不完全平衡并且有 classes 少于 6 个样本和 b) 邻居的数量是 6。您的问题的一些解决方案:
计算SMOTEclass的199个classes和select
n_neighbors
参数中的最小样本数(n_samples)class 小于或等于 n_samples.使用
SMOTE
class 的ratio
参数排除 n_samples < n_neighbors 的 classes ].使用没有类似限制的
RandomOverSampler
class组合 3 和 4 解决方案:创建一个使用
SMOTE
和RandomOversampler
的管道,以满足条件 n_neighbors <= n_samples for smoted classes 并在不满足条件时使用随机过采样。
尝试为 SMOTE 执行以下代码
oversampler=SMOTE(kind='regular',k_neighbors=2)
这对我有用。
我认为可以使用代码:
sampler = SMOTE(ratio={1: 1927, 0: 300},random_state=0)
为什么会发生:
在我的例子中,它的发生是因为我的一些 values/categories 样本只有 1 个。由于 SMOTE 基于 KNN 概念,因此无法将 SMOTE 应用于 1 个采样值。
我是如何解决的:
Since those 1 sampled values/categories were equivalent to outliers, i removed them from the dataset and then applied SMOTE and it worked.
Also try decreasing the
k_neighbors
parameter to make it work
xr, yr = SMOTE(k_neighbors=3).fit_resample(x, y)
当类别中的样本数量非常少(小于 k_neighbors
参数)时会发生这种情况。
您可以通过将这些值称为离群值来移除这些值,或者更改 k_neighbors
参数作为解决方案。