2022年1月4日火曜日

AIを使った何か?例えば主成分分析

 機械学習は魔法ではなくデータを分類する手法です。

例えば身長が高ければ体重は重くなります。ある程度の人数のデータを機械学習して身長175cmの体重を予測する事は出来ます。精度を上げる為に性別や骨格の情報を追加していけばより良い予測ができる事は理解出来ると思います。その計算に右足と左足の長さをデータとして追加しても役に立たない事も理解出来そうです。それでは年齢を追加したらどうでしょう?

結局は追加して予測精度を調べるしかありません。

あるお店の外気温による飲み物の売上の予測はどうでしょうか?

気温が上がれば増えるでしょう。でも気温が30度を超えて40度になっても数量は増えないでしょう。それだけ気温が高いとそもそも外出しないでしょうし。逆に10度になってら減るでしょうか?

マイナス5度になれば売上はマイナスになるでしょうか?

機械学習はコンピューターを使うので計算式を入力する必要があります。

何が言いたいかと言うと社内の業務改善にAIを導入といった考え方ではなく、社内のデータを使って何をする為にどのデータが必要なのかを決めないとどうしようもありません。

最初に手法があると説明しましたが。身長から体重の予測や気温から飲み物の予測は線形回帰やロジスティック回帰、それ以外にも決定木、サポートベクターマシン、XGブースト…

数十種類の手法がありデータや予測したいものによって使い分けます。どれが最適か色々な手法を試す必要があります。

先ほどの左右の足の長さのように不要なデータで機械学習すると当然予測はおかしくなります。

私は知識をしてそれらを知っていますが、プログラムを実装した事はありません。それを始める前に手術してそれらを始める事ができていません。

仮に予測したいことがあれば調べて実装をしようと思いますが、いつまでに出来るかわかりません。

年末年始を利用して少しサンプルの実装していますが、データの前処理も大変です。

今は主成分分析をしています。

体重や身長、足の長さ、気温、性別等のデータの中から予測したい目的にどれほど影響しているかを数学的に分析する機械学習です。

との様に計算するかと言うとそれぞれの数値の平均と取得したデータの差を2乗してそれぞれのデータに相関関係がないかを分散共分散行列を求めて2、3種類までデータを絞る方法です。

それぞれのデータは目的に対して意味あるものであれが多くあれば予測精度が上がりますが研鑽コストも上がってしまします。その項目(説明変数)が使えるか使えないかを数学的に解く手法の一つです。




パイソンのコードです。

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt



# In[2]:



df = pd.read_csv('titanic_train.csv')

df.head()



# In[3]:



df.info()   



# In[4]:



df['Age'] = df['Age'].fillna(df['Age'].mean())

df['Embarked'] = df['Embarked'].fillna(df['Embarked'].mode()[0])


df.info()



# In[5]:



X = df.drop(columns=['PassengerId', 'Survived', 'Name', 'Ticket', 'Cabin'])

y = df['Survived']


X.head()



# In[6]:



from sklearn.preprocessing import LabelEncoder


cat_features = ['Sex', 'Embarked']


for col in cat_features:

    lbl = LabelEncoder()

    X[col] = lbl.fit_transform(list(df[col].values))

    

X.head()



# In[7]:



from sklearn.preprocessing import StandardScaler


num_features = ['Age', 'Fare']


for col in num_features:

    scaler = StandardScaler()

    X[col] = scaler.fit_transform(np.array(df[col].values).reshape(-1, 1))

    

X.head()



# In[8]:



from sklearn.decomposition import PCA


pca = PCA()


X_pca = pca.fit_transform(X)

X_pca



# In[9]:



def plot_2d(X, y):

    plt.plot(X[:, 0][y==0], X[:, 1][y==0], "bo", ms=15)

    plt.plot(X[:, 0][y==1], X[:, 1][y==1], "r^", ms=15) 

    plt.xlabel("First Principal Component")

    plt.ylabel("Second Principal Component")

    plt.legend(['Not Survived', 'Survived'], loc="best")


plt.figure(figsize=(6, 6))

plot_2d(X_pca, y)

plt.show()



# In[10]:



import matplotlib.pyplot as plt

from mpl_toolkits.mplot3d import Axes3D

from matplotlib.widgets import Slider

import numpy as np

get_ipython().run_line_magic('matplotlib', 'widget')

def plot_3d(X, y):

    fig = plt.figure(figsize=(6, 6))

    ax = fig.add_subplot(111, projection='3d')

    

    ax.plot(X[:, 0][y==0], X[:, 1][y==0], X[:, 2][y==0], "bo", ms=15)

    ax.plot(X[:, 0][y==1], X[:, 1][y==1], X[:, 2][y==1], "r^", ms=15)

    

    ax.set_xlabel("First Principal Component", fontsize=15)

    ax.set_ylabel("Second Principal Component", fontsize=15)

    ax.set_zlabel("Third Principal Component", fontsize=15)

    ax.legend(['Not Survived', 'Survived'], loc="best", fontsize=16)

    

plot_3d(X_pca, y)

plt.show()

1 件のコメント:

  1. >何が言いたいかと言うと社内の業務改善にAIを導入といった考え方ではなく、社内のデータを使って何をする為にどのデータが必要なのかを決めないとどうしようもありません。

    まさにココですよね。
    大商、勝山君案件が少しでも前に進みますように…。

    返信削除