SMOTE值错误

时间:2017-08-29 15:44:59

标签: python machine-learning

我正在使用SMOTE函数对我的稀疏数据集进行过采样,该数据集包含大约98%0s& 2%1s.I使用以下代码

from imblearn.over_sampling import SMOTE
import os
import pandas as pd
df_input= pd.read_csv('input_tr.csv',index_col=0) 
train_X=df_input.ix[:, df_input.columns != 'row_num']
df_output=pd.read_csv("output_tr.csv",index_col=0)
train_y=df_output
sm = SMOTE(random_state=12, ratio = 1.0)
train_X_sm,train_y_sm=sm.fit_sample(train_X,train_y)

我收到了以下错误

line 347, in kneighbors
(train_size, n_neighbors)
ValueError: Expected n_neighbors <= n_samples,  but n_samples = 4, n_neighbors = 6

你能帮我解决这个错误吗?

2 个答案:

答案 0 :(得分:3)

我有一个类似的问题。

SMOTE基于 KNN算法,因此 需要最少数量的样本 来创建此子集的新实例。< / p>

例如:

  • 如果你试图预测是一个整数值,类1,2,3,并假设你只有2个1级样本,那么如何获得k-3个邻居?将是不可能的。这太不平衡!!

信息很清楚:

  

预期的n_neighbors&lt; = n_samples。

因此,您需要比邻居更多或等于 SAMPLES 来创建新实例。

我看你的数据集,你只有4个OUTPUT 1样本。所以,消息说你只有4个,但我需要6个邻居来创建它们的新实例。

答案 1 :(得分:0)

基本上,这是一个不平衡的数据集,不允许使用KNN的问题。

如果对于实例,您将拥有一个仅包含一个实例的类,则将无法计算SMOTE,因为会出现以下错误: 预期的n_neighbors <= n_samples,但n_samples = 1,n_neighbors = 2

这基本上意味着一个实例没有任何邻居可用于过采样。

  • 解决方案是改用另一种技术-例如RandomOversampling(即使每个类只有一个实例也没有问题)。
  • 或者选择删除实例太少的类。
  • 或者,或者为k指定另一个值,而不是默认值: k = 1#邻居数 sm = SMOTE(k_neighbors = k,random_state = seed)