成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

機器學習中處理不平衡數據集的五種方法

人工智能 機器學習
不平衡數據集是指在分類任務中,不同類別的樣本數量差異顯著的數據集,通常表現為少數類樣本遠少于多數類樣本。這樣的數據集在現實生活中很常見,比如欺詐檢測、醫療診斷、故障預測等場景。

大家好,我是小寒

今天給大家分享處理不平衡數據集的常用方法。

在開始之前,我們先來了解一下什么是不平衡的數據集。

不平衡數據集是指在分類任務中,不同類別的樣本數量差異顯著的數據集,通常表現為少數類樣本遠少于多數類樣本。這樣的數據集在現實生活中很常見,比如欺詐檢測、醫療診斷、故障預測等場景。

例如,在一個包含 10,000 個實例的數據集中,95% 屬于一個類(類 0),只有 5% 屬于另一個類(類 1),很明顯,模型可能會高度關注多數類,而經常完全忽略少數類。

不平衡數據的問題

在不平衡的數據集中,多數類別主導著模型的預測,導致少數類別的預測性能較差。

例如,如果 95% 的數據被標記為 0 類,則將所有實例預測為 0 類可獲得 95% 的準確率,即使 1 類預測完全不正確。

示例:

考慮一個欺詐檢測系統,其中 99% 的交易是合法的,只有 1% 是欺詐的。預測所有交易均為合法的模型將達到 99% 的準確率,但無法檢測到任何欺詐行為,使其無法達到預期目的。

讓我們通過一個例子來可視化不平衡數據

import numpy as np
import pandas as pd
import plotly.express as px
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix
import plotly.figure_factory as ff

# Generate imbalanced data
n_samples = 10000
class_0_ratio = 0.95
n_class_0 = int(n_samples * class_0_ratio)
n_class_1 = n_samples - n_class_0

X_class_0 = np.random.randn(n_class_0, 2)
X_class_1 = np.random.randn(n_class_1, 2) + 2  # Shift class 1 data

y_class_0 = np.zeros(n_class_0)
y_class_1 = np.ones(n_class_1)

X = np.concatenate((X_class_0, X_class_1), axis=0)
y = np.concatenate((y_class_0, y_class_1), axis=0)

# Create a Pandas DataFrame for easier handling
df = pd.DataFrame(X, columns=['Feature 1', 'Feature 2'])
df['Target'] = y

# Visualize class distribution
fig = px.histogram(df, x='Target', title='Class Distribution', width=800, height=600)
fig.update_layout(title_x=0.5)
fig.update_xaxes(tickvals=[0, 1], ticktext=['Class 0', 'Class 1'])
fig.show()

# Split data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Train a Logistic Regression model
model = LogisticRegression()
model.fit(X_train, y_train)

# Make predictions on the test set
y_pred = model.predict(X_test)

# Evaluate the model
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)

print(f"Accuracy: {accuracy:.4f}")
print(f"Precision: {precision:.4f}")
print(f"Recall: {recall:.4f}")
print(f"F1-score: {f1:.4f}")

# Confusion Matrix
cm = confusion_matrix(y_test, y_pred)
fig = ff.create_annotated_heatmap(cm, x=['Predicted 0', 'Predicted 1'], y=['True 0', 'True 1'])
fig.update_layout(title_text='Confusion Matrix', width=800, height=600, title_x=0.5)
fig.show()

此代碼生成一個不平衡的數據集,其中 95% 的實例被標記為類 0,只有 5% 被標記為類 1。

當我們可視化類別分布時,我們會看到兩個類別之間的明顯不平衡。

圖片圖片

Accuracy: 0.9815
Precision: 0.8451
Recall: 0.6977
F1-score: 0.7643

混淆矩陣顯示,雖然準確率很高,但少數類(類1)的準確率和召回率要低得多。該模型偏向多數類。

圖片圖片

import plotly.express as px

df["Target"] = df["Target"].astype(str)
fig = px.scatter(df, x='Feature 1', y='Feature 2', color='Target', title='Original Dataset')
fig.update_layout(title_x=0.5, width=800, height=600)
fig.show()

圖片圖片

處理不平衡數據的技術

1.隨機欠采樣

隨機欠采樣是一種通過減少多數類樣本的數量來平衡類分布的方法。

具體做法是隨機選擇部分多數類樣本并將其移除,使得多數類和少數類的樣本數量接近平衡。

優點

  • 簡單易行,不需要復雜的算法。
  • 減少了數據集的規模,降低了計算成本。

缺點

  • 可能丟失重要的多數類信息,導致模型性能下降。
  • 縮小的數據集可能導致模型對多數類的泛化能力變差。
from imblearn.under_sampling import RandomUnderSampler
from collections import Counter

# Use RandomUnderSampler to balance the dataset
undersampler = RandomUnderSampler(sampling_strategy='auto', random_state=42)
X_resampled, y_resampled = undersampler.fit_resample(X, y)

# Check the original class distribution
print("Original class distribution:", Counter(y))
# Check the new class distribution after undersampling
print("New class distribution after undersampling:", Counter(y_resampled))

X_train, X_test, y_train, y_test = train_test_split(X_resampled, y_resampled, test_size=0.2, random_state=42)

# Train a simple logistic regression model
model = LogisticRegression(solver='liblinear')
model.fit(X_train, y_train)

# Make predictions
y_pred = model.predict(X_test)

# Evaluate the model
accuracy = accuracy_score(y_test, y_pred)

print(f"Accuracy: {accuracy:.4f}")

# Distribution of undersampled data
df_resampled = pd.DataFrame(X_resampled, columns=['Feature 1', 'Feature 2'])
df_resampled['Target'] = y_resampled

df_resampled["Target"] = df_resampled["Target"].astype(str)
fig = px.scatter(df_resampled, x='Feature 1', y='Feature 2', color='Target', title='Undersampled Dataset')
fig.update_layout(title_x=0.5, width=800, height=600)
fig.show()

圖片圖片

2.隨機過采樣

隨機過采樣通過增加少數類樣本的數量來平衡類分布。

常見的做法是隨機復制少數類的樣本,直到少數類樣本的數量與多數類樣本的數量相等。

優點

  • 不會丟失數據,不像欠采樣那樣丟失多數類的樣本。
  • 在數據較少時,可以通過增加樣本數量提高模型的學習效果。

缺點

  • 由于重復樣本的存在,可能導致模型過擬合少數類樣本。
from imblearn.over_sampling import RandomOverSampler

# Check the original class distribution
original_class_distribution = Counter(y)
print("Original class distribution:", original_class_distribution)

# Initialize RandomOverSampler
oversampler = RandomOverSampler(sampling_strategy='auto', random_state=42)

# Apply random oversampling to balance the dataset
X_oversampled, y_oversampled = oversampler.fit_resample(X, y)

# Check the new class distribution after oversampling
new_class_distribution = Counter(y_oversampled)
print("New class distribution after oversampling:", new_class_distribution)

X_train, X_test, y_train, y_test = train_test_split(X_oversampled, y_oversampled, test_size=0.2, random_state=42)

# Train a simple logistic regression model
model = LogisticRegression(solver='liblinear')
model.fit(X_train, y_train)

# Make predictions
y_pred = model.predict(X_test)

# Evaluate the model
accuracy = accuracy_score(y_test, y_pred)

print(f"Accuracy: {accuracy:.4f}")

df_resampled = pd.DataFrame(X_oversampled, columns=['Feature 1', 'Feature 2'])
df_resampled['Target'] = y_oversampled

df_resampled["Target"] = df_resampled["Target"].astype(str)
fig = px.scatter(df_resampled, x='Feature 1', y='Feature 2', color='Target', title='Oversampled Dataset')
fig.update_layout(title_x=0.5, width=800, height=600)
fig.show()

圖片圖片

3.SMOTE

SMOTE 是一種合成過采樣方法,通過生成新的少數類樣本來平衡數據集。

它不是簡單地復制現有的少數類樣本,而是通過對現有少數類樣本的特征進行插值,創建新樣本。

具體來說,SMOTE 從少數類樣本中選取一個樣本和其最近鄰樣本,在它們之間生成新的合成樣本。

優點

  • 通過生成新樣本代替簡單復制,緩解了過擬合的問題。
  • 利用插值方法生成多樣化的少數類樣本,擴展了少數類樣本的分布。

缺點

  • 生成的合成樣本可能落在錯誤的決策邊界上,尤其是在樣本分布不清晰時。
  • 對高維數據的效果不佳,因為高維數據中的樣本通常稀疏,插值生成的樣本可能不具有代表性。
from imblearn.over_sampling import SMOTE

# Check the original class distribution
original_class_distribution = Counter(y)
print("Original class distribution:", original_class_distribution)

# Initialize SMOTE
smote = SMOTE(sampling_strategy='auto', random_state=42)

# Apply SMOTE to balance the dataset
X_smote, y_smote = smote.fit_resample(X, y)

# Check the new class distribution after SMOTE
new_class_distribution = Counter(y_smote)
print("New class distribution after SMOTE:", new_class_distribution)

X_train, X_test, y_train, y_test = train_test_split(X_smote, y_smote, test_size=0.2, random_state=42)

# Train a simple logistic regression model
model = LogisticRegression(solver='liblinear')
model.fit(X_train, y_train)

# Make predictions
y_pred = model.predict(X_test)

# Evaluate the model
accuracy = accuracy_score(y_test, y_pred)

print(f"Accuracy: {accuracy:.4f}")

df_resampled = pd.DataFrame(X_smote, columns=['Feature 1', 'Feature 2'])
df_resampled['Target'] = y_smote

df_resampled["Target"] = df_resampled["Target"].astype(str)
fig = px.scatter(df_resampled, x='Feature 1', y='Feature 2', color='Target', title='SMOTE Dataset')
fig.update_layout(title_x=0.5, width=800, height=600)
fig.show()
df_resampled["Target"].value_counts()

圖片圖片

4.成本敏感型學習

成本敏感型學習通過為分類錯誤分配不同的成本來解決數據不平衡問題。

在不平衡數據集中,錯分少數類的代價通常比多數類更高。成本敏感型學習通過在損失函數中引入成本矩陣來調整模型,使得少數類的錯分類損失更大,從而引導模型更加關注少數類。

優點

  • 不需要對數據進行重采樣,可以直接在模型訓練中融入不平衡問題。
  • 可以靈活調整不同錯誤分類的成本,適應不同場景的需求。

缺點:

  • 成本矩陣的設置需要根據實際問題調整,具有一定的挑戰性。
  • 在處理嚴重不平衡的數據時,仍可能遇到少數類樣本過少的問題。
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import classification_report
from imblearn.under_sampling import RandomUnderSampler
from collections import Counter
from sklearn.datasets import make_classification

# Create a mock imbalanced dataset
X, y = make_classification(n_classes=2, weights=[0.99, 0.01], n_samples=1000, random_state=42)
print('Original class distribution:', Counter(y))

# Train a cost-sensitive decision tree
model = DecisionTreeClassifier(class_weight={0: 1, 1: 10}, random_state=42)
model.fit(X, y)

# Evaluate the model
y_pred = model.predict(X)
print(classification_report(y, y_pred))

5.平衡隨機森林

平衡隨機森林是在隨機森林的基礎上改進的一種方法,針對不平衡數據集做了優化。

它通過在構建每棵決策樹時,對多數類進行隨機欠采樣,確保每棵樹的訓練集都是平衡的。同時,它結合了隨機森林的特性,通過多個弱分類器的集成來提高整體的預測能力。

優點

  • 保留了隨機森林的優勢,如高準確性和魯棒性。
  • 對多數類進行欠采樣,能夠減少模型對多數類的偏向,提高對少數類的預測能力。
  • 集成多個決策樹,具有較強的泛化能力,減少了單一模型的偏差。

缺點:

  • 相比于傳統隨機森林,平衡隨機森林的計算成本更高,因為需要對多數類進行多次欠采樣。
  • 欠采樣過程中可能丟失多數類的重要信息,影響模型的整體表現。
from imblearn.ensemble import BalancedRandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# Split the data
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# Train a Balanced Random Forest model
brf = BalancedRandomForestClassifier(random_state=42)
brf.fit(X_train, y_train)

# Evaluate
y_pred = brf.predict(X_test)
print('Balanced Random Forest Accuracy:', accuracy_score(y_test, y_pred))


責任編輯:武曉燕 來源: 程序員學長
相關推薦

2019-02-25 08:35:22

機器學習數據模型

2019-03-27 08:51:38

機器學習類失衡算法

2021-01-04 10:40:37

Python不平衡數據機器學習

2016-12-13 11:48:05

數據處理不平衡數據

2020-09-21 09:02:56

AI機器學習類不平衡

2017-03-28 09:40:23

機器學習數據不平衡

2017-06-16 22:14:45

機器學習數據不平衡

2022-05-06 09:48:56

機器學習樣本不平衡

2025-01-20 09:00:00

2018-04-20 11:33:22

不平衡數據數據集模型

2016-09-07 13:26:25

R語言不平衡數據

2017-03-20 09:25:10

機器學習采樣數據合成

2023-09-29 22:51:22

數據不平衡Python機器學習

2023-12-26 15:32:25

不平衡數據過采樣機器學習

2018-09-11 13:47:35

數據不平衡數據分布數據集

2020-11-02 10:54:18

機器學習技術人工智能

2020-10-31 17:16:31

機器學習數據缺失數據科學

2020-10-06 10:44:16

機器學習不平衡數據算法

2021-06-06 22:41:30

人才技術預測不平衡

2018-06-11 16:20:22

數據不平衡數據集算法
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品一区二区在线免费观看 | 99资源| 一区二区三区免费在线观看 | 亚洲精品乱码久久久久v最新版 | 国产999精品久久久久久绿帽 | 欧美美女二区 | 欧美1—12sexvideos | 亚洲精品视频在线观看免费 | 黄色高清视频 | 国产在线观看一区二区 | 天天综合网天天综合 | 亚洲视频一区二区三区四区 | 欧美日韩视频一区二区 | 亚洲精品久久久一区二区三区 | 一区二区三区福利视频 | 精品久久久久一区二区国产 | 91视频在线 | 精品国产99 | 久久人 | 日本久久网 | 国产传媒在线观看 | 中文字幕91| 国产农村妇女精品一区 | 精品久久香蕉国产线看观看亚洲 | 国产精品不卡视频 | 成人免费一区二区三区视频网站 | 偷偷操视频 | 在线a视频| 欧美 日韩 亚洲91麻豆精品 | 91人人在线 | 一区二区三区四区在线视频 | 欧美日韩在线精品 | 国家aaa的一级看片 h片在线看 | 久久另类视频 | 久久久久国产一区二区三区四区 | 日韩成人免费视频 | 亚洲激情综合 | 香蕉一区 | 一区二区三区四区不卡视频 | 日韩视频一区二区 | 亚洲福利 |