<jupyter_start><jupyter_text>クラス不均衡への対処<jupyter_code>import numpy as np
import matplotlib.pyplot as plt
from sklearn.metrics import classification_report
from sklearn import model_selection
from sklearn.ensemble import ExtraTreesClassifier

%matplotlib inline
%run utilities.ipynb

# ファイルを読み込む
input_file = './data/data_imbalance.txt'
data = np.loadtxt(input_file, delimiter=',')

# Xは最終列までの値、yは最終列
X, y = data[:, :-1], data[:, -1]

# yのラベル地に基づいてclass_0とclass_1で分ける
class_0 = np.array(X[y==0])
class_1 = np.array(X[y==1])

# グラフの箱を作る
plt.figure()

# ラベルが0のものはxで表示する。
# s：マーカーのサイズ、facecolor：マーカーの塗り潰し色、edgecolors：マーカーの境界色
plt.scatter(class_0[:, 0], class_0[:, 1], s=75, facecolor='black', edgecolors='black', linewidths=1, marker='x')

# ラベルが1のものはoで表示する。
plt.scatter(class_1[:, 0], class_1[:, 1], s=75, facecolor='white', edgecolors='black', linewidths=1, marker='o')

plt.title("input data")
plt.show()<jupyter_output><empty_output><jupyter_text>○の方がxより圧倒的に多いデータセットになっている。  これが**データの不均衡**    これをこのまま扱ってみる<jupyter_code># 訓練用データを75%、テスト用データは25%
# random_stateは結果に再現性を求める時に指定すると良い。
X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.25, random_state=1)

# n_estimatorsは構築する決定木の数、max_depthは決定木の深さ
params = {'n_estimators': 100, 'random_state': 0, 'max_depth': 4,
         'class_weight': 'balanced'
         }
classifier = ExtraTreesClassifier(**params)

# 訓練
classifier.fit(X_train, y_train)

# 訓練された決定木にテスト用データを当てはめた場合、適切に分類されるか見る
visualize_classifier(classifier, X_test, y_test, 'Test Dataset')
# テスト用データでラベルを予測する
y_test_pred = classifier.predict(X_test)

class_names = ['Class_0', 'Class_1']
print("Classifier performance on test dataset\n")
print(classification_report(y_test, y_test_pred, target_names=class_names))<jupyter_output>Classifier performance on test dataset

              precision    recall  f1-score   support

     Class_0       0.00      0.00      0.00        73
     Class_1       0.81      1.00      0.89       302

    accuracy                           0.81       375
   macro avg       0.40      0.50      0.45       375
weighted avg       0.65      0.81      0.72       375
{'fraction_non_alphanumeric': 0.11954992967651196, 'fraction_numerical': 0.04453820909517112, 'mean_word_length': 4.295285359801489, 'pattern_counts': {'":': 0, '<': 8, '<?xml version=': 0, '>': 8, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '2', 'dir': 'jupyter-structured-clean-dedup', 'id': '125373', 'license': 'Unlicense', 'n_tokens_mistral': 1032, 'n_tokens_neox': 990, 'n_words': 148, 'path': 'Ex/Chapter3/.ipynb_checkpoints/Chapter3-5-checkpoint.ipynb', 'repo_name': 'tryoutlab/python-ai-oreilly', 'size': '2133'}