2013年6月3日月曜日

[Python] 簡単な機械学習プログラム

機械学習における分類問題,回帰問題,およびクラスタリングのプログラム例を以下に示します.
まずは,分類問題,回帰問題,およびクラスタリングについての簡単な説明を記します.
  • 分類問題:与えられたデータから分類(クラス)を予測する問題.正解データから分類のルールを学び,未知のデータに対しても分類ができるようになることを目指す.各分類をラベルと表現することもある.
  • 回帰問題:与えられたデータから数値を予測する問題.分類問題と同様に,正解データからルールを学び,未知のデータに対しても対応する数値を予測することを目指す.
  • クラスタリング:データの性質に従って,データの塊(クラスタ)を作る.データの性質に着目するので,正解データを必要としない.
以下の例では,2次関数(y = x^2)のデータを用い,yの値にノイズが乗っているものとします(実際にはノイズ込みのデータしか得られない).
まずは,データの準備を行うために以下のようなプログラムを作成します.

### Preparing data (import module)
import matplotlib.pyplot as plt
import numpy as np

### Various definitions (constants and parameters)

# Defined range of x axis
x_max = 1
x_min = -1

# Defined range of y axis
y_max = 2
y_min = -1

# Scale (how many points in 1 unit)
SCALE = 50

# Specify the percentage of Test data with train/test
TEST_RATE = 0.3

### Generate data
data_x = np.arange(x_min, x_max, 1 / float(SCALE)). reshape(-1, 1)

data_ty = data_x ** 2   # Value before noise is added
data_vy = data_ty + np.random.randn(len(data_ty), 1) * 0.5 # Add noise

### Split into learning data/test data
### Use for classification problem and regression problem

# Split processing of learning data/test data
def split_train_test(array):
    length = len(array)
    n_train = int(length * (1 - TEST_RATE))

    indices = list(range(length))
    np.random.shuffle(indices)
    idx_train = indices[:n_train]
    idx_test = indices[n_train:]

    return sorted(array[idx_train]), sorted(array[idx_test])

# Split index list
indices = np.arange(len(data_x))   # List of index values
idx_train, idx_test = split_train_test(indices)

# Learning data
x_train = data_x[idx_train]
y_train = data_vy[idx_train]

# test data
x_test = data_x[idx_test]
y_test = data_vy[idx_test]

### Graph drawing
# Scatter plot of analysis symmetric point
plt.scatter(data_x, data_vy, label='target')

# Show original line
plt.plot(data_x, data_ty, linestyle=':', label='non noise curve')

# Set range of x axis / y axis
plt.xlim(x_min, x_max)
plt.ylim(y_min, y_max)

# Specify the display position of the legend
plt.legend(bbox_to_anchor = (1.05, 1), loc = 'upper left', borderaxespad = 0)

# Show graph

plt.show()

このプログラムを実行すると,以下のようなグラフが作成されます.
もう一度実行すると,以下のようになります.
上記のグラフにおいて,点線はノイズが乗っていない2次関数曲線を表しています.また,点(target)は乱数によって作成しているので,実行のたびに点の位置が変わります.










実行結果:
accuracy_score:
 0.9666666666666667
Confusion matrix:
 [[18  0]
 [ 1 11]]
もう一度実行すると,以下のようになります.

accuracy_score:
 0.9333333333333333
Confusion matrix:
 [[19  1]
 [ 1  9]]








0 件のコメント :

コメントを投稿