SIGNATEで天秤のバランス分類に参加した

https://qiita.com/wawana12/items/3c330e1b97b8807efe2e

https://qiita.com/wawana12/items/ce1f240fe68143a01853

SIGNATEで、タイタニックの生存予測、アヤメの分類に続いて、天秤のバランス分類に参加しました。

# 天秤のバランス分類
天秤のバランス分類（練習問題）に参加しました。

https://signate.jp/competitions/130

このコンペでは、重量と距離の情報から天秤の状態を分類するモデルを作成します。

まず、データタブから学習用データ（train.tsv）、評価用データ（test.tsv）、応募用サンプルファイル（sample_submit.csv）をダウンロードしました。
解析環境にGoogle Colaboratoryを用いるため、ダウンロードしたデータはGoogle Driveに移動します。
私は、Google Driveにbalanceディレクトリを作成し、balanceディレクトリにtrain.tsv、test.tsv、sample_submit.csvを移動しました。

そして、Google Colaboratoryを起動し、コードを書いていきます。

## ライブラリのインポート
```Python
# NumPy、pandas、seaborn、matplotlib.pyplotのインポート
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
```

## データの読み込み
```Python
# データの読み込み
train = pd.read_csv("/content/drive/MyDrive/balance/train.tsv", sep='\t')
test = pd.read_csv("/content/drive/MyDrive/balance/test.tsv", sep='\t')
sample_submit = pd.read_csv("/content/drive/MyDrive/balance/sample_submit.csv", header=None)
```
```Python
train.head()
```
![スクリーンショット 2023-12-22 0.20.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/5e118cc9-3320-e003-a5a3-02db89ff25b9.png)

```Python
test.head()
```
![スクリーンショット 2023-12-22 0.20.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/05f83dc4-6092-e45c-103c-343ec11425ef.png)

```Python
sample_submit.head()
```
![スクリーンショット 2023-12-22 0.20.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/deb3823f-c8d5-4700-e716-1300e34646ca.png)

## データの可視化
### classの可視化
```Python
sns.countplot(x="class", data=train)
plt.show()
```
![Unknown-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/3d5af4db-20b0-cf74-b20e-a553ca0de364.png)

classは天秤のバランスで、0が左、1が平衡、2が右です。
0と2が多く、1が少ないことがわかります。

### class、left_weight、left_distance、right_weight、right_distanceの可視化
```Python
sns.pairplot(train[["class", "left_weight", "left_distance", "right_weight", "right_distance"]], hue="class", palette="tab10")
plt.show()
```
![Unknown-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/249e3257-2096-ae75-a2e3-13f5522ae1ba.png)

0はleft_weight、left_distanceが大きく、2はright_weight、right_distanceが大きいことがわかります。

### classとleft_weightの可視化
```Python
sns.countplot(x="left_weight", hue="class", data=train)
plt.show()
```
![Unknown-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/cf7ba222-1548-b819-5f9c-7e1070aa17a6.png)

### classとleft_distanceの可視化
```Python
sns.countplot(x="left_distance", hue="class", data=train)
plt.show()
```
![Unknown-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/bb97006a-1e30-e939-af26-2dd8ed8351de.png)

### classとright_weightの可視化
```Python
sns.countplot(x="right_weight", hue="class", data=train)
plt.show()
```
![Unknown-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/1262978e-677f-e329-f007-8189e952eedd.png)

### classとright_distanceの可視化
```Python
sns.countplot(x="right_distance", hue="class", data=train)
plt.show()
```
![Unknown-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/9c395fde-6723-593c-8d40-69dec99ea1ba.png)

## データ前処理
### trainとtestの連結
```Python
data = pd.concat([train, test], sort=False)
```

### データの確認
```Python
data.head()
```
![スクリーンショット 2023-12-22 0.42.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/14d639c7-2121-f7bf-81a7-d06520eb1566.png)

```Python
print(len(train), len(test), len(data))
```
```
312 313 625
```

### 欠損値の確認
```Python
data.isnull().sum()
```
![スクリーンショット 2023-12-22 0.38.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/03cee983-322f-9c53-e3c3-e8ca1f903855.png)

### 不要列の削除
```Python
delete_columns = ['Unnamed: 0']
data.drop(delete_columns, axis=1, inplace=True)
data.head()
```
![スクリーンショット 2023-12-22 0.43.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/37ee6691-a096-d57a-4014-61d04b8f20a1.png)

## 学習データとテストデータの抽出
```Python
train = data[:len(train)]
test = data[len(train):]

y_train = train['class']
X_train = train.drop('class', axis = 1)
X_test = test.drop('class', axis = 1)
```
```Python
X_train.head()
```
![スクリーンショット 2023-12-22 0.44.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/71528a79-bc89-8c06-7237-35fbb62ef0ab.png)

```Python
y_train.head()
```
![スクリーンショット 2023-12-22 0.44.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/584cb3f5-1616-52c9-7f0f-fe11b0d48f23.png)

## 機械学習
```Python
from sklearn.linear_model import LogisticRegression

clf = LogisticRegression(max_iter=1000)
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
clf.score(X_train, y_train)
```
```
0.8782051282051282
```

```Python
y_pred[:10]
```
```
array([0., 2., 2., 0., 2., 2., 0., 0., 0., 2.])
```

## データの出力
```Python
sub = sample_submit
sub[1] = list(map(int, y_pred))
sub.to_csv("/content/drive/MyDrive/balance/submit.csv", index=False, header=False)
```
submit.csvが出力されたことを確認したら、コンペのサイトに移動します。
https://signate.jp/competitions/130
![スクリーンショット 2023-12-22 0.48.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/1e878df2-d174-e38a-a989-dd8a8d8fa055.png)

右下の投稿をクリックし、ファイルを選択からsubmit.csvをアップロードします。
これにより、結果を提出することができました。
暫定評価は0.8881789でした。
このコンペは、アヤメの分類と同じく取り組みやすいコンペなので、初心者におすすめです。
引き続き、テーブルコンペの練習問題に取り組んでいきます。