-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]]