本來打算用情感分類
數據集拿Transformer
模型來練練手,發現訓練效果并不好。當我分析了這個數據集的標簽后發現問題了:
- 查看標簽的分布:
import pandas as pd# 先直接讀取數據,不進行后續處理
data_file = '~/data/simplifyweibo_4_moods.csv'
df = pd.read_csv(data_file)
print(df.head())
df['label'].value_counts().sort_index()
輸出如下:
label review
0 0 啊呀呀!要死啦!么么么!只穿外套就好了,我認為里面那件很多余啊周小倫喜歡 你各種 五角星的...
1 0 嗯……既然大姚通知了……那我也表示下收到……姚,你知道嗎?假如外星人入侵地球,只要摧毀我們的...
2 0 風格不一樣嘛,都喜歡!最喜歡哪張?
3 0 好呀,試試D .I .Y .去死皮面膜1.將燕麥片加水中浸泡6小時,加入木瓜牛奶攪拌。2.放...
4 0 張老師,謝謝儂的信任!粉絲多少無所謂重在質地近日發現一個現象——他加了你關注,你回加后,他立...
label
0 199496
1 51714
2 55267
3 55267
Name: count, dtype: int64
這樣看確實沒啥問題,也正如網上所說的,標簽的與id的對應是:
'喜悅': 0,
'憤怒': 1,
'厭惡': 2,
'低落': 3
但是使用代碼:df.drop_duplicates(subset=['review'])
根據評論數據進行過濾,發現標簽3
消失了。
2. 查看代碼分布:
from sklearn.model_selection import train_test_split# 首先檢查原始數據中的標簽分布
print("原始數據中的標簽分布:")
raw_df = pd.read_csv(data_file)
print(raw_df['label'].value_counts().sort_index())
print("原始數據中的唯一標簽:", raw_df['label'].unique())# 檢查標簽類型
print("\n標簽的數據類型:", raw_df['label'].dtype)# 讀取數據并進行基本清洗
print("\n應用數據清洗后:")
df = pd.read_csv(data_file).dropna(subset=['review','label'])
print("1. 刪除空值后的標簽分布:")
print(df['label'].value_counts().sort_index())# 刪除重復的評論
df = df.drop_duplicates(subset=['review'])
print("\n2. 刪除重復評論后的標簽分布:")
print(df['label'].value_counts().sort_index())# 檢查是否有label為3的數據
if 3 not in df['label'].unique():print("\n警告:數據清洗后沒有label為3的數據!")# 查找原因:檢查label為3的數據是否都有空值或重復label3_raw = raw_df[raw_df['label'] == 3]print(f"原始數據中label為3的樣本數:{len(label3_raw)}")label3_null = label3_raw['review'].isna().sum()print(f"其中有空值的樣本數:{label3_null}")# 檢查是否所有label為3的樣本都是重復的temp_df = raw_df.dropna(subset=['review','label'])label3_after_dropna = temp_df[temp_df['label'] == 3]print(f"刪除空值后label為3的樣本數:{len(label3_after_dropna)}")# 檢查重復情況all_reviews = set(temp_df['review'])label3_reviews = set(label3_after_dropna['review'])unique_label3_reviews = label3_reviews - (all_reviews - label3_reviews)print(f"label為3的唯一評論數:{len(unique_label3_reviews)}")print(f"label為3的評論與其他標簽重復的數量:{len(label3_reviews) - len(unique_label3_reviews)}")# 確保label列是整數類型
df['label'] = df['label'].astype(int)# 如果需要保留label為3的數據,可以修改去重策略
# 例如:只在相同標簽內去重,而不是跨標簽去重
def preserve_label3(raw_df):# 按標簽分組,然后在每個組內去重groups = []for label, group in raw_df.dropna(subset=['review','label']).groupby('label'):# 在每個標簽組內去重group_dedup = group.drop_duplicates(subset=['review'])groups.append(group_dedup)# 合并所有組return pd.concat(groups)# 應用新的去重策略
print("\n使用修改后的去重策略:")
df_preserved = preserve_label3(raw_df)
print(df_preserved['label'].value_counts().sort_index())
print("修改后的唯一標簽:", df_preserved['label'].unique())# 使用修改后的數據集
df = df_preserved# 查找相同評論對應不同標簽的數據
print("\n查找相同評論對應不同標簽的數據:")
raw_df_clean = raw_df.dropna(subset=['review','label'])# 找出重復的評論
duplicate_reviews = raw_df_clean[raw_df_clean.duplicated(subset=['review'], keep=False)]# 按評論分組,找出每個評論對應的不同標簽
review_label_groups = duplicate_reviews.groupby('review')['label'].unique()# 篩選出有多個不同標簽的評論
multi_label_reviews = review_label_groups[review_label_groups.apply(len) > 1]print(f"有{len(multi_label_reviews)}條評論對應多個不同的標簽")# 顯示前10個多標簽評論的例子
if len(multi_label_reviews) > 0:print("\n以下是前10個多標簽評論的例子:")for i, (review, labels) in enumerate(multi_label_reviews.items()):if i >= 10:breakprint(f"評論: {review[:50]}{'...' if len(review) > 50 else ''}")print(f"對應的標簽: {labels}")print("-" * 50)
輸出如下:
原始數據中的標簽分布:
label
0 199496
1 51714
2 55267
3 55267
Name: count, dtype: int64
原始數據中的唯一標簽: [0 1 2 3]標簽的數據類型: int64應用數據清洗后:
1. 刪除空值后的標簽分布:
label
0 199496
1 51714
2 55267
3 55267
Name: count, dtype: int642. 刪除重復評論后的標簽分布:
label
0 199496
1 51661
2 55169
Name: count, dtype: int64警告:數據清洗后沒有label為3的數據!
原始數據中label為3的樣本數:55267
其中有空值的樣本數:0
刪除空值后label為3的樣本數:55267
label為3的唯一評論數:55267
label為3的評論與其他標簽重復的數量:0使用修改后的去重策略:
label
0 199496
1 51714
2 55267
3 55267
Name: count, dtype: int64
修改后的唯一標簽: [0 1 2 3]查找相同評論對應不同標簽的數據:
有55318條評論對應多個不同的標簽以下是前10個多標簽評論的例子:
評論: !!!!!!!!!!我的胃~ ~ ~ 這個星期你受苦了~ ~ ~ 留口水。。。看著照片,老想家了。。...
對應的標簽: [2 3]
--------------------------------------------------
評論: !!!!!!!【今年12星座最終留下啥遺憾】從我遇見你的那天起,我所做的每一件事都是為了接近你。
對應的標簽: [2 3]
--------------------------------------------------
評論: !!!!!!!忘了剛夢啥了。再夢一個。
對應的標簽: [2 3]
--------------------------------------------------
評論: !!!!!!終 於出了..好想要吖 : 炒起距!閩Α 2還 ?100。頗為貴左d 。
對應的標簽: [2 3]
--------------------------------------------------
評論: !!!!!敗了。。這個狠。這個…真狠~
對應的標簽: [2 3]
--------------------------------------------------
評論: !!!半夜三更餓了什么的最討厭了
對應的標簽: [2 3]
--------------------------------------------------
評論: !!!抽自己,還有什么臉!!!還有什么臉面胖下去T .T 求掉肉那是相當相當的勵志太勵志了太勵志了,...
對應的標簽: [2 3]
--------------------------------------------------
評論: !" !一個開頭恐怖,中間可笑,結局悲慘的故事:遇見芙蓉姐姐,愛上芙蓉姐姐,娶了芙蓉姐姐
對應的標簽: [2 3]
--------------------------------------------------
評論: !~ !~ !~ !~ !忒可愛了,這毛毛腿。每次見到你肥肥的小手,我就想到了銅鑼燒。
對應的標簽: [2 3]
--------------------------------------------------
評論: !“癌癥媽媽”郭雪姣一路走好!讓我們記住她的樂觀與堅強。【“癌癥媽媽”昨天走了讓我們記住她的樂觀和勇...
對應的標簽: [2 3]
--------------------------------------------------
可以看出標簽3
就是一個擺設,這個數據集就是一個三分類的數據集,而不是四分類的。
請大家注意一下。