类不平衡数据调整分布(pandas和sklearn两种解决方法) 如何在Python中选择数据集中特定数量的01样本

如何在Python中选择数据集中相等数量的0和1值

介绍:

在数据处理中,有时候会遇到类不平衡的情况,即某些类别的样本数量明显偏多或偏少。在处理类不平衡数据时,有时需要从数据集中选择相等数量的样本,以保持数据的平衡性。

比如在电商评论数据中,五星评论数量远远高于其他数据。

df = pd.read_csv('京东评论数据.csv')
df['content'].groupby(df['score']).count()

得到结果:
在这里插入图片描述

解决

这里的解决思路是从两个样本中分别选出等量的样本/或者特定比例的样本

pandas解决

  1. 首先,使用pandas库将数据加载到一个DataFrame中。
  2. 接下来,从数据集中选择所有值为0的数据。
  3. 然后,从数据集中随机选择与值为0的数据数量相等的值为1的数据。
  4. 最后,将选定的数据合并成一个新的DataFrame,即所需的平衡数据集。
import pandas as pd

# 加载数据
data = pd.read_csv('data.csv')

# 选择值为0的数据
data_0 = data[data['column_name'] == 0]

# 选择等量的值为1的数据
data_1 = data[data['column_name'] == 1].sample(n=len(data_0), random_state=1)

# 合并数据
selected_data = pd.concat([data_0, data_1])
# 现在,selected_data中包含了你所需的数据,其中包括相同数量的0和1的值

用在我们的电商平台评论数据上就是

import pandas as pd
df = pd.read_csv('京东评论数据.csv')
df['score'].astype(int)
df_0 = df[df['score']<4]
df_1 = df[df['score']>=4].sample(n=len(df_0),random_state=1)
data = pd.concat([df_0,df_1])
data['score'].astype(int)
data['content'].groupby(data['score']).count()

得到结果:

在这里插入图片描述

sklearn解决

思路和pandas相同,仍然是分别选择再合并,只是我们使用resample函数调整数据集大小

from sklearn.utils import resample
import pandas as pd

# 加载数据
data = pd.read_csv('data.csv')

# 分割数据为值为0和值为1的两个子集
data_0 = data[data['column_name'] == 0]
data_1 = data[data['column_name'] == 1]

# 从值为1的数据中随机选择与值为0的数据相等数量的样本
data_1_downsampled = resample(data_1, replace=False, n_samples=len(data_0), random_state=1)

# 合并数据
balanced_data = pd.concat([data_0, data_1_downsampled])

# balanced_data 现在包含了相等数量的值为0和1的数据

评论数据分析练习

最后放一个我做的基于svm电商评论数据情感分类案例,大家看个乐子吧
数据来源:群鲸 3000条京东手机评论

数据预处理
import pandas as pd
df = pd.read_csv('京东评论数据.csv')
df['score'].astype(int)
df_0 = df[df['score']<4]
df_1 = df[df['score']>=4].sample(n=len(df_0),random_state=1)
data = pd.concat([df_0,df_1])
data['score'].astype(int)
data['content'].groupby(data['score']).count()
生成文本向量,划分训练集
import jieba
emotion= []
text_split=[]
## score》=4视为积极
for index,row in data.iterrows():
    if row['score']>=4:
        emotion.append(1)
    else:
        emotion.append(0)
    bg=jieba.lcut(row['content'])
    text_split.append(" ".join(bg))
    
from sklearn.feature_extraction.text import CountVectorizer
cv=CountVectorizer()
X=cv.fit_transform(text_split).toarray()
Y = emotion
拟合模型进行预测
from sklearn.model_selection import train_test_split
from sklearn import svm
import time

start_time = time.time()
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=1)
svm = svm.SVC(kernel='sigmoid',gamma=0.7,C=10,max_iter=1000)
svm.fit(X_train,Y_train)
Y_pred = svm.predict(X_test)
from sklearn import metrics
print(svm.score(X_test,Y_test))
print("report:\n",metrics.classification_report(Y_test,Y_pred))
print(metrics.confusion_matrix(Y_test,Y_pred))
end_time = time.time()

得到精确度和召回率都是0.65左右,效果不是很好哈哈哈,您可以调整参数或者用其他模型分类

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值