k-meansによるクラスタリングの例

・K-meansとは?

データをいくつかのグループに分ける手法の一つです。

・2次元データの例

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
from sklearn.datasets import make_blobs

# ガウス分布に従う2変数データの塊を3つ作成
X, y = make_blobs(n_samples=100,centers=3, n_features=2, random_state=0, center_box=(-30,30))
# データフレームに格納
df_2 = pd.DataFrame(X,columns=["x1","x2"])
df_2["y"] = y
# プロット
sns.pairplot(df_2,hue="y")

このデータに対してクラスタリングをかけます。
試すクラスタ数は2〜5

from sklearn.cluster import KMeans

n_cluster_list = [2,3,4,5]
sse_list = []

for n_cluster in n_cluster_list:
    # KMeansの実行
    kmeans = KMeans(n_clusters=n_cluster,random_state=0).fit(df_2[["x1","x2"]])
    # ラベルの出力
    df_2["{}_cluster".format(n_cluster)] = kmeans.predict(df_2[["x1","x2"]])
    # クラスタ内誤差平方和(SSE)の出力
    sse_list.append(kmeans.inertia_)

エルボー図を確認しましょう

# SSE値の分布の確認
plt.plot(n_cluster_list,sse_list,"-o")
plt.title("sse distribution")
plt.xlabel("n_cluster")
plt.ylabel("sse")
plt.grid()

最適なクラスタ数は3であることが分かりました。

・3次元データの例

# ガウス分布に従う3変数データの塊を3つ作成
X, y = make_blobs(n_samples=100,centers=3, n_features=3, random_state=0, center_box=(-30,30))
# データフレームに格納
df_3 = pd.DataFrame(X,columns=["x1","x2","x3"])
df_3["y"] = y
# プロット
sns.pairplot(df_3,hue="y")

# 3Dでのプロット
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure(figsize=(8,6))
ax = fig.add_subplot(111, projection="3d")

y_label_list = list(df["y"].unique())
y_label_list.sort()
for y_label in y_label_list:
    ax.scatter(df_3[df_3["y"]==y_label]["x1"],df_3[df_3["y"]==y_label]["x2"],df_3[df_3["y"]==y_label]["x3"],label=y_label)
ax.legend(loc=0)

このデータに対してクラスタリングをかけます。
試すクラスタ数は2〜5

n_cluster_list = [2,3,4,5]
sse_list = []

for n_cluster in n_cluster_list:
    # KMeansの実行
    kmeans = KMeans(n_clusters=n_cluster,random_state=0).fit(df_3[["x1","x2"]])
    # ラベルの出力
    df_3["{}_cluster".format(n_cluster)] = kmeans.predict(df_3[["x1","x2"]])
    # クラスタ内誤差平方和(SSE)の出力
    sse_list.append(kmeans.inertia_)

エルボー図を確認しましょう

# SSE値の分布の確認
plt.plot(n_cluster_list,sse_list,"-o")
plt.title("sse distribution")
plt.xlabel("n_cluster")
plt.ylabel("sse")
plt.grid()

前回と同様に、最適なクラスタ数は3であることが分かりました。

 

 

Kaggleコンペ(Instant Gratification)

今日からInstant Gratificationコンペに参加します。
https://www.kaggle.com/c/instant-gratification/

【コンペ名】
Instant Gratification

【データの説明】
匿名データの二値分類

【コード】

まずは、訓練データとテストデータのサイズを確認します。

import numpy as np
import pandas as pd 
import os
import matplotlib.pyplot as plt
import seaborn as sns

df_train = pd.read_csv("../input/train.csv")
df_test = pd.read_csv("../input/test.csv")

print("trian data shape = ".format(df_train.shape))
print("test data shape = ".format(df_test.shape))
trian data shape = (262144, 258)
test data shape = (131073, 257)

つぎに、訓練データに注目し、データフレームの先頭5行分確認します

display(df_train.head())

カラム名が匿名なため、データの意味は不明

次は、分類の目的変数であるtargetの個数を確認する。

sns.countplot(df_train["target"])

“0”,”1″ラベルの個数は両方ともだいたい同じであるようだ。

次は、欠損値の確認。

# 欠損値の確認
null_train_se = df_train.isnull().sum()
# nullが存在するカラム名の表示
print(null_train_se[null_train_se==1])
Series([], dtype: int64)

欠損値はないことがわかった。

各説明変数の分布はどうなっているか確認する。

# 特徴の名前を取得
feature_name_list = [feature_name for feature_name in df_train.columns if not feature_name in ["id","target"]]
# 分布プロット用の関数
def distplot(df_1,df_2,label_1,label_2,feature_name_list,row_size,col_size):
    plt.figure()
    ratio = int(len(feature_name_list)/col_size)
    plt.subplots(row_size,col_size,figsize=(15,5*(ratio+1)))
    cnt = 0
    for feature_name in feature_name_list:
        cnt += 1
        plt.subplot(row_size,col_size,cnt)
        sns.distplot(df_1[feature_name],hist=False,label=label_1)
        sns.distplot(df_2[feature_name],hist=False,label=label_2)
        plt.title(cnt)
        

distplot(df_train[feature_name_list].loc[df_train["target"] == 0],
         df_train[feature_name_list].loc[df_train["target"] == 1],
         "0","1",feature_name_list,64,4)

256個のグラフが出力されるが、数が多すぎるので、その中の一部を示す。

上の4つのグラフのうち、右から2番目のwheezy-copper-turtie-magicという変数の分布は他のグラフと比べて形が大きく異なる。
実は、この変数以外の255個の変数はだいだい0周辺に値が集中している分布だ。
target=0とtarget=1との分布の違いは見られなかった。

ボストン市の住宅価格を線形回帰で予測する

教師あり学習である回帰を利用して実際のデータを予測しましょう。

from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
import pandas as pd
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt

# ボストン市の住宅価格
boston = load_boston()

# データフレームに変換
df = pd.DataFrame(boston.data, columns=boston.feature_names)
df["PRICE"] = boston.target
df.head()

データの意味は以下の表に書いてあります。

引用:https://pythondatascience.plavox.info/scikit-learn/scikit-learn%E3%81%AB%E4%BB%98%E5%B1%9E%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BB%E3%83%83%E3%83%88

# データ間の相関係数を求める
corr_mat = df.corr(method="pearson") 
# ヒートマップで可視化
sns.heatmap(corr_mat, vmax=1, vmin=-1, center=0, annot=True, fmt=".1f")

# RM(部屋の数)と価格のヒストグラムと散布図を表示
sns.pairplot(df[["RM", "PRICE"]])

# 部屋の数を変数x, 価格を変数yに保存
x = df["RM"]
y = df["PRICE"]
# 列ベクトルに変換
x = np.array(x).reshape(-1,1)
y = np.array(y).reshape(-1,1)


# 訓練データとテストデータに分割
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=0)


# モデルの学習
model = LinearRegression()
model.fit(x_train, y_train)

# 係数の確認
a = model.coef_
b = model.intercept_
print("coefficient a = %f" % a)
print("intercept b = %f" % b)

coefficient a = 9.311328
intercept b = -35.994349

y_train_pred = model.predict(x_train)
plt.scatter(x_train, y_train)
plt.plot(x_train, y_train_pred, "r", lw=3)
plt.ylabel("PRICE")
plt.xlabel("NUMBER OF ROOMS")

# 訓練データの平均平方二乗誤差を求める
print("RMSE train : %f" % np.sqrt(mean_squared_error(y_train, y_train_pred)))

RMSE train : 6.492892

y_test_pred = model.predict(x_test)
plt.scatter(x_test, y_test)
plt.plot(x_test, y_test_pred, "r", lw=3)
plt.ylabel("PRICE")
plt.xlabel("NUMBER OF ROOMS")

# 訓練データの平均平方二乗誤差を求める
print("RMSE train : %f" % np.sqrt(mean_squared_error(y_test, y_test_pred)))

RMSE train : 6.858064

価格は1000ドル単位なので、約7000ドルほど誤差があるようです。

今回は部屋の数のみ考慮しましたが、他の変数も考慮すれば、精度が向上する可能性はあるでしょう。

教師あり学習について

教師あり学習には以下の2つがあります。

・回帰
数値を予測する手法です。
例えば、明日のアイスクリームの売上を天気予報の最高気温から予測する時に使います。

・分類
データをカテゴリ分けする手法です。
例えば、人の顔が写った画像が田中さんなのか鈴木さんなのか分類する時に使います。

機械学習について(初心者向け)

こんにちは。

久しぶりの投稿になりますが、今回は機械学習について初歩的な解説をしていこうと思います。

まず、人工知能・機械学習・深層学習の位置づけを整理しますと、以下の図のようになります。(よく見る図かも、、、)

機械学習概観

第三次人工知能ブームの火付け役となった深層学習は機械学習の一部です。
機械学習と深層学習は別々ではないのです。

では、機械学習にはどのようなものがあるのでしょうか。
次の図を見てください。

そうです。
機械学習には3種類の学習方法があるのです。
順番に見ていきましょう。

①教師あり学習
これはインプットとアウトプットとの対応関係を学習する方法です。
例えば、動物の画像認識について考えてみましょう。
この場合は動物画像(インプット)と犬、猫などのラベル(アウトプット)との対応関係を学習します。

②教師なし学習
これはインプットデータの特徴を学習する方法です。
例えば、インプットデータとして20代の男女の身長と体重を考えてみましょう。
縦軸を身長、横軸を体重としてデータをプロットすると、データは2つのグループに別れるでしょう。
教師なし学習であるクラスタリングという手法を使うと、
データの特徴を学習し、データを2つのグループに分けることができます。

③強化学習
エージェントがゴールに沿った行動をとると報酬を与えることで行動規則を学習する手法です。
例としては自動運転が分かりやすいでしょう。

 

今日はここまでですが、次回は教師あり学習について詳しく見ていこうと思います。

Progate

最近プログラミング学習サイトProgateを利用してRuby on Railsを勉強していました。

初めてProgateを利用したのですが、今ではお気に入りのサイトです。

ネットに繋がりさえすればブラウザ上でコーディングから実行までできてしまうため、環境構築の必要がないところが楽です。

また、プログラムの説明をするスライドが分かりやすいため、理解に困ることがありません。

そして、学習を進めるとレベルが上がるため、達成感を感じやすくなっています。

twitterのようなSNSサービスをRuby on Railsで作成するという内容で、最後までやり通したので、次は以下のサイトで勉強しようと思います。

https://railstutorial.jp/chapters/beginning?version=5.1#cha-beginning

「~激論!AI時代の幸せな生き方とは?!~」について

久しぶりにこの動画を見返してみました。2回くらい。

落合陽一さんや堀江貴文さんがAIについてどう考えているのかを確かめたいと思ったからです。

印象に残ったことをつらつらと書きます。

まず、「AIは知能をもつのは難しいのでは?」という疑問を持つ人が多いとおもいますが、例え知能を持たないとしても、

深層学習のような条件反射的に解くAIが湯水のように大量にあれば、それは十分シンギュラリティと呼んでよいだろうと思いました。

なぜなら、世の中の仕事の大半はあるパターンによって解決できるものだと思うからです。

深層学習のモデルを作成するのは人間の仕事だと思いますが、将来的にインプットとアウトプットを用意すれば、

最適なモデルを自動生成することができるだろうし、一度できたモデルは流用することができるので、

モデルが蓄積されればされるほど、モデル作成すらやらなくてよくなるでしょう。

そして、すごいのは、このモデルは世代を超えることができるのです。自分たちが作成したモデルを子供達に受け継がせることができます。

例えば、「生体データ」がインプットで「投与すべき薬」をアウトプットとするAIを作ることができれば、子どもたちは薬剤師になるために勉強しなくても、

そのモデルを使用すればよくなります。これは薬剤師の判断能力が継承可能になったということです。

こうなると、教育は変わらざるをえないでしょう。

人間の定義が変わるという二人の言葉が心に残りました。

Machine Learning 15minutes

「第22回 Machine Learning 15minutes!」に行ってきました。

深層学習の研究者や、元googleの機械学習エンジニア、ロボットエンジニアなどなどいろいろな人が登壇されていましたが、

その中で一際目立ったのが人間中心設計専門家の羽山さんでした。

スライドの内容がとても分かりやすく、プレゼンもうまいので、

気づいたらプレゼンが終わってしまったと思うくらいに話に引きこまれました。

以下がそのスライドです。

 

羽山さんは他のイベントでモテについての発表もしているのですが、こちらもとても面白かったです。

「モテの高みの先に広がっていたのは、寂寞とした砂漠だった。」

どいうことか気になる方はぜひスライドを見てください。

 

人工知能とブロックチェーン

人工知能とブロックチェーンについて分かりやすく解説している動画があったので、紹介します。

印象に残ったのは動画の24:20あたりのスライドでSirajが解説しているOpenMinedの仕組みです。

データサイエンスをしたいけど、データがなかなか手に入らないため、モデルの訓練ができないというのはよくあると思います。データを提供する人にとってはプライバシーが気になりますから、、、

そんな問題をOpenMinedは解決しようとしています。

データがもっとオープンになれば、人工知能の活用が進み、新しいサービスを提供したり、作業を自動化することができると思うので、OpneMinedの今後の動向に注目していきたいです。

OpenMinedのgithub
https://github.com/OpenMined/Docs

スマートコントラクト

ブロックチェーンの勉強をしていると、スマートコントラクトという言葉が出てくるのですが、
これがいまいちイメージが湧きにくいです。

スマートコントラクトの例として自動販売機がよく挙げられますが、それでもピンと来ません。

ということで以下のサイトを参考にして、簡単なスマートコントラクトを書いてみました。

https://book.ethereum-jp.net/first_use/contract.html

簡単にいうと、スマートコントラクトというのはオブジェクト指向のクラスのようなもので、クラス変数とメソッドを持っています。

今回はSingleNumRegisterというクラス(コントラクト)を作成しました。
クラス変数は整数値を格納するものが1つ。
メソッドはクラス変数を書き換えるものと読み込むもので2つ。

コントラクトの実行までの流れは以下の通りです。

1.コントラクト・コードの作成

2.コントラクト・コードのコンパイル

3.「Contract」アカウントを作成

4.スマートコントラクトへのアクセスと実行

1~4をやってみると最初よりはスマートコントラクトのイメージが湧いてきました。

例えば、雇用契約をスマートコントラクトで表現するとすれば、
クラス変数には契約内容を格納する変数(String型)と、同意するかどうかの変数(boolean型)を用意し、
メソッドには読み書きできるものを用意すればよいのかなと思いました。

ただ、その場合誰が採掘してくれるのだろうかという疑問は残りました。

スマートコントラクト以外では、
Dappsにも興味があるので、以下のサイトでゾンビと一緒に勉強しようと思います。

https://cryptozombies.io/jp/