overflow33の日記

python 機械学習 系の記事を書いて行きたい所存

sci-kit Learn のiris(アヤメ)データを分類付きでCSVへ保存する

import pandas as pd
import numpy as np
from sklearn.datasets import load_iris

# データセットの読み込み
iris = load_iris()
# データセットに正解ラベルを追加する
# iris.data や iris.target は <numpy.ndarray> 型
# np.append は次元を揃える -> reshape(-1, 1) -> -1 は要素数の自動設定
data = np.append(iris.data, iris.target.reshape(-1, 1), axis=1)
# 特徴量の名前を取得(列ラベルにする) **
colLabels = iris.feature_names.copy()
# data に targetを追加したので、列ラベルにもtargetを追加する
colLabels.append("target")
# pandas DataFrameクラスへ格納
df = pd.DataFrame(data, columns=colLabels)

# ラベルの名前も DataFrame へ追加する
target_names = iris.target_names
# 追加する列を確保
df['target_name'] = ""
# 種類毎にtargetのインデックス(idx)を探し、DataFrameのidxを指定して追加する
for i, target_name in enumerate(target_names):
    idx = df['target'] == i
    df.loc[idx, 'target_name'] = str(target_name)

# データセットの確認
print(df.head(5))
# # CSV形式で保存
saveFilePath = 'iris.csv'
df.to_csv(saveFilePath, encoding="shift-jis")

iris(アヤメ)のデータセットを読み出し、ラベルと種類の名前を追加し、csv形式でファイルへ保存するスクリプトです。
機械学習もまずは、データを読み出して眺めるところから始めましょう。

読み込んだデータの整理には、pandas が非常に便利です。
今回は、csv形式で保存するために正解となるラベル(target)やラベル名(target_name)を列に加えて保存しました。
学習時には、間違って正解ラベルを学習する特徴量に加えないよう、注意してください。

深いコピー(Deep Copy)と浅いコピー(Shallow Copy)

**で示した部分の解説
colLabel = iris.feature_names.copy()
.copy() で深いコピーする。

.copyなしの浅いコピーでは、appendしたとき iris.feature_names の中身まで変わってしまう。
浅いコピーは、C言語ならポインタ渡しを行っているのと同じで、メモリのアドレスのみがコピーされ、メモリ領域を共有する。
深いコピー(.copy())は、実態の複製であり、ここでは iris.feature_names と同じ内容を持った新しいメモリ領域が colLabel に割り当てられる。