我正在处理不平衡的数据集,并希望使用scikit的gridsearchcv进行网格搜索以调整模型的参数。为了对数据进行过采样,我想使用SMOTE,我知道我可以将其作为管道的一个阶段,并将其传递给gridsearchcv。我担心的是,我认为训练和验证折纸都将使用击打,这不是您应该做的。验证集不应过采样。我是否正确,整个管道将应用于两个数据集拆分?如果是的话,我该如何扭转呢?提前谢谢
python machine-learning scikit-learn grid-search oversampling
我有一个非常不平衡的数据集。我使用 sklearn.train_test_split 函数来提取训练数据集。现在我想对训练数据集进行过采样,所以我用来计算 type1 的数量(我的数据集有 2 个类别和类型(type1 和 tupe2),但几乎所有的训练数据都是 type1。所以我不能过采样。
以前我曾经用我编写的代码分割训练测试数据集。在该代码中,所有类型 1 数据的 0.8 和所有类型 2 数据的 0.8 都在训练数据集中。
如何将此方法与 train_test_split 函数或 sklearn 中的其他分割方法一起使用?
*我应该只使用sklearn或我自己编写的方法。
training-data python-3.x scikit-learn oversampling imbalanced-data
我正在 PyTorch 中训练一个用于二元分类的深度学习模型,并且我有一个包含不平衡类比例的数据集。10%
我的少数派课程由给定的观察结果组成。为了避免模型学习只预测多数类,我想WeightedRandomSampler
在torch.utils.data
我的DataLoader
.
假设我有1000
观察结果(900
在类中0
,100
在类中1
),并且我的数据加载器的批量大小100
为。
如果没有加权随机抽样,我预计每个训练周期将包含 10 个批次。
我在pandas中有一个包含训练示例的DataFrame,例如:
feature1 feature2 class
0 0.548814 0.791725 1
1 0.715189 0.528895 0
2 0.602763 0.568045 0
3 0.544883 0.925597 0
4 0.423655 0.071036 0
5 0.645894 0.087129 0
6 0.437587 0.020218 0
7 0.891773 0.832620 1
8 0.963663 0.778157 0
9 0.383442 0.870012 0
Run Code Online (Sandbox Code Playgroud)
我用它生成的:
import pandas as pd
import numpy as np
np.random.seed(0)
number_of_samples = 10
frame = pd.DataFrame({
'feature1': np.random.random(number_of_samples),
'feature2': np.random.random(number_of_samples),
'class': np.random.binomial(2, 0.1, size=number_of_samples),
},columns=['feature1','feature2','class'])
print(frame)
Run Code Online (Sandbox Code Playgroud)
如您所见,训练集是不平衡的(8个样本具有0级,而只有2个样本具有1级).我想对训练集进行过度采样.具体来说,我想用1级复制训练样本,以便训练集是平衡的(即,0级样本的数量与1级样本的数量大致相同).我怎么能这样做?
理想情况下,我想要一个可以推广到多类设置的解决方案(即,类列中的整数可能大于1).
如何在 LSTM 中的词嵌入层之前应用 SMOTE 算法。
我有一个文本二进制分类问题(Good(9500) 或 Bad(500) 评论,总共有 10000 个训练样本,它是不平衡的训练样本),意思是当我使用 LSTM 和预训练的词嵌入(100 维空间用于每个单词)也是如此,所以每个训练输入都有一个单词词典的 id(当文本描述少于 50 个单词时,总共 50 个 id 填充为零,当描述超过 50 个字符时,修剪为 50)。
下面是我的一般流程,
我只想在 SMOTE 的帮助下生成更多数据以进行差评
我有 7 个类,记录总数为 115,我想对这些数据运行随机森林模型。但由于数据不足以获得高精度。因此,我想对所有类应用过采样,以使多数类本身获得更高的计数,然后相应地获得少数。这在 PySpark 中可能吗?
+---------+-----+
| SubTribe|count|
+---------+-----+
| Chill| 10|
| Cool| 18|
|Adventure| 18|
| Quirk| 13|
| Mystery| 25|
| Party| 18|
|Glamorous| 13|
+---------+-----+
Run Code Online (Sandbox Code Playgroud) 我正在使用 CNN 进行二元分类,并且数据不平衡,其中正医学图像:负医学图像 = 0.4:0.6。所以我想在训练前使用 SMOTE 对正医学图像数据进行过采样。但是,数据的维度是 4D (761,64,64,3) 导致错误
Found array with dim 4. Estimator expected <= 2
Run Code Online (Sandbox Code Playgroud)
所以,我重塑了我的 train_data:
X_res, y_res = smote.fit_sample(X_train.reshape(X_train.shape[0], -1), y_train.ravel())
Run Code Online (Sandbox Code Playgroud)
它工作正常。在将其提供给 CNN 之前,我通过以下方式对其进行了重塑:
X_res = X_res.reshape(X_res.shape[0], 64, 64, 3)
Run Code Online (Sandbox Code Playgroud)
现在,我不确定它是否是一种正确的过采样方法,重塑操作符会改变图像的结构吗?
machine-learning image-processing scikit-learn deep-learning oversampling
我正在尝试使用 MultinomialNB 进行一些文本分类,但我遇到了问题,因为我的数据不平衡。(为简单起见,下面是一些示例数据。实际上,我的数据要大得多。)我正在尝试使用过采样对我的数据进行重新采样,并且理想情况下我希望将其构建到此管道中。
下面的管道在没有过度采样的情况下工作正常,但同样,在现实生活中我的数据需要它。这是非常不平衡的。
使用此当前代码,我不断收到错误消息:“TypeError:所有中间步骤都应该是转换器并实现拟合和转换。”
如何将 RandomOverSampler 构建到此管道中?
data = [['round red fruit that is sweet','apple'],['long yellow fruit with a peel','banana'],
['round green fruit that is soft and sweet','pear'], ['red fruit that is common', 'apple'],
['tiny fruits that grow in bunches','grapes'],['purple fruits', 'grapes'], ['yellow and long', 'banana'],
['round, small, green', 'grapes'], ['can be red, green, or purple', 'grapes'], ['tiny fruits', 'grapes'],
['small fruits', 'grapes']]
df = pd.DataFrame(data,columns=['Description','Type'])
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state = 0)
text_clf = Pipeline([('vect', …
Run Code Online (Sandbox Code Playgroud) 假设我们有一个由20个浮点数组成的向量V。是否可以在每对浮点之间插入值,以使向量V成为正好有50个数字的向量。
插入值应该是介于上限和下限之间的随机数,我决定在两者之间插入两个值的中点。
我尝试了以下方法:
vector<double> upsample(vector<double>& in)
{
vector<double> temp;
for (int i = 1; i <= in.size() - 1 ; i++)
{
double sample = (in[i] + in[i - 1]) / 2;
temp.push_back(in[i - 1]);
temp.push_back(sample);
}
temp.push_back(in.back());
return temp;
}
Run Code Online (Sandbox Code Playgroud)
使用此功能,输入向量元素增加2(n)-1(20个元素变为39)。输入向量的大小可能小于50。
我认为可以通过在两个元素之间随机插入多个值以具有大小为50的向量来完成此操作(例如,在V [0]和V [1]之间插入3个值,在V [3]和V [4]之间插入1值等)。这可能吗?
您能指导我如何执行此操作吗?谢谢。
我想同时应用交叉验证和过采样。我从这段代码中得到以下错误:
from sklearn.pipeline import Pipeline, make_pipeline
imba_pipeline = make_pipeline(SMOTE(random_state=42),
LogisticRegression(C=3.4))
cross_val_score(imba_pipeline, X_train_tf, y_train, scoring='f1-weighted', cv=kf)
Run Code Online (Sandbox Code Playgroud)
所有中间步骤应该是转换器并实现拟合和转换,或者是字符串 'passthrough' 'SMOTE(k_neighbors=5, kind='deprecated', m_neighbors='deprecated', n_jobs=1, out_step='deprecated', random_state=42 , ratio=None, sampling_strategy='auto', svm_estimator='deprecated')' (type ) 不
附注。我用得到同样的错误imblearn.over_sampling.RandomOverSampler而非SMOTE。
oversampling ×10
python ×4
scikit-learn ×4
python-3.x ×2
c++ ×1
grid-search ×1
pandas ×1
pipeline ×1
pyspark ×1
pytorch ×1
resampling ×1
smote ×1
tensorflow ×1