# example of training a final classification model
from sklearn.linear_model import LogisticRegression
from sklearn.datasets.samples_generator import make_blobs
from matplotlib import pyplot as plt
import numpy as np
100個のデータサンプルをランダムで生成します。ランダムなデータのうち中心点(集中している部分)を二か所設けます。
# generate 2d classification dataset
X, y = make_blobs(n_samples = 100, #サンプル数(default=100)
centers = 2, # 中心の個数(塊(ブロブ)の数default=none)
n_features = 2, # 特徴量の数(default=2)
random_state = 1) # default=none
print(X[0:3]); print(y) # n_samplesの最初の3行、 n_features(100件)を出力
plt.scatter(X[:, 0], X[:, 1], marker = 'o', c = 'blue', s = 25, edgecolor = 'k') # Xの散布図を表示
plt.show()
ロジスティック回帰モデル学習する(l-bfgs(bryoyden-Fletcher-Goldfarb-Shanno)、準ニュートン法
# fit final model
model = LogisticRegression(solver = 'lbfgs')
model.fit(X, y) # 与えられた入力でモデルを訓練する(学習)
print('score:', model.score(X, y))
print('predict:', model.predict(X)) # 新データに対する予測
coef = model.coef_[0]
intercept = model.intercept_
print('intercept: ', intercept)
print('coef:', coef)
line = np.linspace(-12, 0) # 数列の始点、終点
plt.plot(line, -(line * coef[0] + intercept) / coef[1], c = 'r', label = "LogisticRegression") # 境界線
plt.scatter(X[:, 0], X[:, 1], marker = 'o', c = 'blue', s = 25, edgecolor = 'k') # Xの散布図を表示
plt.show()
ここからのデータは、アリゾナ州に住むPima Indiansの糖尿病発症データセットのデータを用います。オブジェクトを直列化することでオブジェクトの状態を保存することができるpickleを用いてモデルを保存します。
import pandas as pd
from pandas.plotting import scatter_matrix
from sklearn import model_selection
from sklearn.linear_model import LogisticRegression
import pickle
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv"
names = ['preg', # Number of times pregnant 妊娠回数
'plas', # Plasma glucose concentration 血糖濃度
'pres', # Diastolic blood pressure 最低血圧
'skin', # Triceps skin fold thickness 上腕三頭筋皮下脂肪の厚さ
'test', # serum insulin 血清インスリン濃度
'mass', # Body mass index BMI
'pedi', # Diabetes pedigree function 糖尿病血統要因
'age', # Age 年齢
'class'] # Class variable (0 or 1) 糖尿病が陽性ならば 1
dataframe = pd.read_csv(url, names = names) # pandasを用いたCSVの読み込み
array = dataframe.values
X = array[:, 0:8] # 説明変数
Y = array[:, 8] # 目的変数
print('X shape: {}, y shape {}'.format(X.shape, y.shape))
#dataframe.head()
dataframe.tail()
# 訓練用データと試験用データに分割する
test_size = 0.33 # 試験用データは、1/3
seed = 7 # 乱数のシード
X_train, X_test, Y_train, Y_test = model_selection.train_test_split(X, Y, test_size=test_size, random_state=seed)
# Fit the model on 33%
model = LogisticRegression(solver = 'lbfgs', max_iter = 150)
model.fit(X_train, Y_train)
print('Train score: {:.3f}'.format(model.score(X_train, Y_train))) # 小数点以下3桁表示
print('Test score: {:.3f}'.format(model.score(X_test, Y_test)))
scatter_matrix(dataframe, hist_kwds = {'bins': 20}, color = 'g', figsize = (9,9))
plt.show()
モデルを保存し、再度読み込む
# pickleでモデルを保存し、再度読み込む(joblib is deprecated)
# save the model to disk
filename = 'finalized_model.sav'
pickle.dump(model, open(filename, 'wb')) # pickleでオブジェクトを保存
# some time later...
# load the model from disk
loaded_model = pickle.load(open(filename, 'rb')) # pickleでオブジェクトを読み込み