牧千夏の話したいこと

読んだ本や考えたことを勝手に紹介しています。

与える役割を引き受ける

週末、高校の剣道部の友達と会いました。大好きだった友達が、いまの持ち場でも彼女たちのやり方で活躍しているのは、嬉しいですね。元気づけられます。

 

同世代の友達と話すと、いまは私たちは与える世代にいるのだと、つくづく感じます。子育てが最たるものですが、介護や家族のトラブルの解決、仕事もそうですね。自分の持てる心と時間とを、今まで私たちに与えてくれた世代に返し、新しく生まれた世代に惜しまず与える。自己犠牲というと、出た出た宮沢賢治、と小馬鹿にされそうですが、ケアの役割を担っている人は、家にいる時間の大半は自分でない人のために使っているので、犠牲という表現がぴったりな時間が日々あるわけです。

 

一方で、そうした役割から下りざるを得ない人も少しずつ出てきます。事故、病気、不運。ひとごとではありません。

 

私は時間にケチな人間です。でも、友達が頑張っているのをみると、ああ自分も頑張ろうと思います。私の手を必要としてくれる人がいるのだから、なるべく惜しまずに手を差し出したいですね。

 

もうすぐ30代も終わりです。40代はもっとおおらかな心で、自分を差し出せる10年にしたいですね。

プログラミング学習_機械学習6 予測性能評価

  • 平均二乗誤差(mse:mean squared error)の計算

書き方

Mean_squared_error(予測結果,正解データ)

x=df.loc[:,"SNS1":"original"]

t=df["sales"]

from sklearn.linear_model import LinearRegression

model=LinearRegression()

model.fit(x,t)#モデルをつくる

 

from sklearn.metrics import mean_squared_error

pred=model.predict(x)#モデルに予測predictさせる

 

mse=mean_squared_error(pred,t)

mse

  • 2乗平均平方根誤差(RMSE:Root Mean squared error)
    • skleanにはRMSEを直接計算する関数がない
    • 標準ライブラリのmathからsqrt関数を利用する
    • MSE/RMSEは誤差を二乗するので、大きい誤差が強調される
    • MAEは誤差の絶対値なので外れ値の影響が相対的に小さい、RMSEのほうが外れ値に影響を受けやすい

import math

math.sqrt(mse)

比較すると次のようになる

from sklearn.metrics import mean_absolute_error

yosoku=[2,3,5,7,11,13]

target=[3,5,8,11,16,19]

 

mse=mean_squared_error(yosoku,target)

print("rmse:{}".format(math.sqrt(mse)))

print("mae:{}".format(mean_absolute_error(yosoku,target)))

rmse:3.8944404818493075

mae:3.5

 

yosoku2=[2,3,5,7,11,1,43]

target2=[3,5,8,11,16,19,23]

mse2=mean_squared_error(yosoku2,target2)

print("rmse:{}".format(math.sqrt(mse2)))

print("mae:{}".format(mean_absolute_error(yosoku2,target2)))

rmse:10.549204438521148

mae:7.571428571428571

  • 適合率precision
    • 予測はリスクとコストのバランスを考えなくてはならない
    • それを測る予測モデルの性能の指標に適合率と再現率がある
    • 適合率は予測したもののなかで、それが正解だったものの割合
    • コストを抑えるときには、適合率が高い方がよい
  • 再現率recall
    • 実際にそうだったもののなかで、それを予測できた割合
    • リスクを抑えるときには、再現率が高い方がよい

import pandas as pd

from pathlib import Path

 

df=pd.read_csv(r"パス")

df=df.fillna(df.mean(numeric_only=True))

#欠損地を平均で埋めたデータフレームをdfに代入

x=df"Pclass","Age"

t=df["Survived"]

 

from sklearn import tree

model=tree.DecisionTreeClassifier(max_depth=2,random_state=0)

#決定木分析で分類モデルをつくる

#決定木はフローチャート的に分類を判定していく方法

#不純度の計算によって、分類モデルを作る

model.fit(x,t)

 

#ここから再現率と適合率を一括で計算する

from sklearn.metrics import classification_report

pred=model.predict(x)

out_put=classification_report(y_pred=pred,y_true=t,output_dict=True)

#output_dict=Trueは戻り値をディクショナリ型にする引数。なければ文字列型になる

print(out_put)

#このままだと普通のディクショナリ型

pd.DataFrame(out_put)

#out_putをデータフレーム型にする

  • f1-score(F値
    • 適合率と再現率の平均として解釈できる指標
    • 適合率と再現率はトレードオフに関係なので、両方を同時に考えたいときは両者の平均値的な解釈をすることのできるf1-scoreを使う
  • K分割交差検証
    • データを学習に利用するデータと予測性能をテストするデータに分ける方法を、ホールドアウト法という
    • ただ、ホールドアウト法はデータを分割した際、どちらかに外れ値が偏る場合がある。そうすると、いい結果が得られない
    • こうした欠点を改善するのがK分割交差検証
    • Kには3つ以上の整数が入る
    • 全データをK個に分割する
    • K=3とすると、
      • まず学習データを1と2、検証データを3とする
      • 続いて学習データを2と3、検証データを1とする
      • 次に学習データを1と3、検証データを2とする
    • この後予測性能の平均値をとる

書き方

分割条件の指定

変数=KFold(n_splits=分割数,shuffle=True,random_state=整数)

# shuffle=Falseにするとランダムに分割されない

K分割交差検証

cross_validate(モデル変数,特徴量データ,正解データ,cv=分割条件,scoring="評価指標",return_train_score=True)

import pandas as pd

from pathlib import Path

df=pd.read_csv(r"パス")

df=df.fillna(df.mean())

x=df.loc[:,"SNS1":"original"]

t=df["sales"]

 

from sklearn.model_selection import KFold

#K分割交差検証のライブラリをインポート

kf=KFold(n_splits=3,shuffle=True,random_state=0)

#n_splits=3は三分割ということ

#kfにはKFold(...) で作った分割器(splitter)が代入される

 

from sklearn.model_selection import cross_validate

from sklearn.linear_model import LinearRegression

model=LinearRegression()

#LinearRegressionは線形重回帰分析

#特徴量を2つ以上にして行う回帰手法

result=cross_validate(model,x,t,cv=kf,scoring="r2",return_train_score=True)

#cvは、cross validation(交差検証)の分割方法を指定

#scoringは評価指標(スコア)を指定

#"r2" は回帰の代表的な指標である 決定係数 R²です。

#return_train_scoreを True にすると、テストスコアだけでなく学習データのスコアも返す

print(result)

sum(result["test_score"]/len(result["test_score"]))

  • StratifiedKFold(層化KFold)
    • ストラティファイドは層化という意味
    • KFoldでは分割データに偏りが生じる場合がある。
    • StratifiedKFoldは分割するときに、各foldのクラス比率(ラベルの割合)を元データに近づける
    • 分類(特に不均衡データ)で強い

感想

簡単にまとめると以下のとおりです。

平均二乗誤差は、予測したデータと、正解データの差の2乗を計算して平均することで、誤差を出し、評価の指標とする。

適合率precisionはコスト重視、再現率recallはリスク重視の指標。両者はトレードオフの関係なのでprecision と recall の バランス指標(調和平均)を参考にするとよい。

K分割交差検証はホールドアウト法だと、外れ値のバランスが悪くなるため、それを補う方法。データを3つ以上にわけて入れ替えて、学習と検証をする。

プログラミング学習_機械学習5 複雑なデータの重回帰分析

  • ダミー変数化は、訓練データと検証データを分ける前に行う

…訓練データからカテゴリ構造を確定させ、その変換規則を検証・テストデータに適用する必要がある。

  • 決定木分析では、特徴量をこちらで指定する。一方、重回帰分析では、モデルが学習を行うとき、自動で特徴量の重要度を下げる仕組みを持たないため、当たられた列をすべて利用しようとする
    • そのため、特徴量として予測に大きな影響を与える列の中に、予測に影響しない列を紛れ込ませると、予測精度が低下する
    • 外れ値の影響は、目的変数や特徴量の組み合わせによって変化するため、影響の大きそうな列を中心に可視化しつつ、モデル全体への影響を確認する必要がある。

col=["INDUS","NOX","RM","PTRATIO","LSTAT","PRICE"]

#予測に強い影響を与える列を絞り込む

train_val4=train_val3[col]

書き方

df.corr()

 train_val4.corr()

#すべての列同士の相関係数を見る

train_cor=train_val4.corr()["PRICE"]

#PRICE列との相関係数のみ知りたいので、PRICE列との相関係数だけ出力する

train_cor

書き方 シリーズの作成

pd.Series(リスト,index=インデックスのリスト)

書き方 シリーズに関数を適用する

se.map(関数名)

#seはシリーズの変数

abs_cor=train_cor.map(abs)

#train_corは一列なのでシリーズ

#mapメソッドをつかって、abs関数をtrain_corシリーズに適用する

abs_cor

書き方 シリーズの要素を並び替える

se.sort_values(ascending=○○)

#ascending=Trueなら昇順、Falseなら降順

 

書き方 データフレームの行を並び替える

df.sort_values(by=”○○”,ascending=○○)

abs_cor.sort_values(ascending=False)

  • 順番は、散布図で外れ値のチェック→相関係数のチェック
  • 相関係数は一部の外れ値のせいで、0に近くなることがあるから
  • 特徴量の標準化
    • 各特徴量の分布が大きく異なるときに、その特徴量を標準化する必要がある。
    • 標準化を行うと、平均値が0,標準偏差が1となる

書き方

変数1=StandardScaler()

変数1.fit(データ集合)

変数2=変数1.transform(変換前データ)

from sklearn.preprocessing import StandardScaler

 

sc_model_x=StandardScaler()

#標準化(平均0・分散1)を行うための処理規則を保持できるクラス StandardScaler のインスタンスを生成し、それを sc_model_x という変数に代入している。

#この時点ではまだ平均や標準偏差は計算されておらず、それらは fit() によって学習データから推定・保存される。

#同じ変換をテストデータにも使うため、StandardScaler() を変数に入れる

 

sc_model_x.fit(x_train)

# StandardScaler で定義されたオブジェクトsc_model_x のfitメソッドによって、引数のx_train を 各列ごとに平均値(mean)標準偏差(standard deviation)を計算

#それをsc_model_xに格納する

sc_x=sc_model_x.transform(x_train)

#fit で計算した「平均・標準偏差」を使って、x_train を標準化した新しいデータを作り、それを sc_x に代入する

sc_model_y=StandardScaler()]

#正解データを標準化する

sc_model_y.fit(y_train)

sc_y=sc_model_y.transform(y_train)

 

tmp_df=pd.DataFrame(sc_x,columns=x_train.columns)

#データフレーム型にする

tmp_df.mean()

#各特徴量が、本当に平均0になっているかを確認

 

sc_x_val=sc_model_x.transform(x_val)

#sc_model_xは、StandardScalerクラスのオブジェクト

#ここには訓練データ(x_train)の平均値や標準偏差の情報が格納されている

#それを利用して、x_val(検証用データ)も標準化する

sc_y_val=sc_model_y.transform(y_val)

model.score(sc_x_val,sc_y_val)

  • チューニング

from sklearn.model_selection import train_test_split

from sklearn.preprocessing import StandardScaler

from sklearn.linear_model import LinearRegression

 

def learn (x,t):

    x_train,x_val,y_train,y_val=train_test_split(x,t,test_size=0.2,random_state=0)

#訓練データと検証用(validation)データに分ける

    sc_model_x=StandardScaler()

#StandardScalerクラスの空のインスタンス(オブジェクト)を作る

    sc_model_x.fit(x_train)

#StandardScalerオブジェクトのfitメソッドを使って、引数x_trainの平均値と標準偏差を計算し、

#scaler に学習させて内部パラメータとしてsc_model_xに保持させる

    sc_x_train=sc_model_x.transform(x_train)

#sc_model_xのデータを使ってx_trainを標準化し、sc_x_trainに代入する

 

    model=LinearRegression()

#回帰モデルの空のインスタンスを作りmodelに格納する

    model.fit(sc_x_train,y_train)

#標準化したsc_x_train,y_trainのデータを用いて、回帰モデルを作り、modelに格納する

    sc_x_val=sc_model_x.transform(x_val)

#検証用データも同じように、“訓練データでfitした同じscaler”で標準化する

    train_score=model.score(sc_x_train,y_train)

    val_score=model.score(sc_x_val,y_val)

#訓練データと検証データを使ってスコアを出す

    return train_score,val_score

 

x=train_val3.loc[:,["RM","LSTAT","PTRATIO"]]

t=train_val3["PRICE"]

 

s1,s2=learn(x,t)

print(s1,s2)

  • 特徴量エンジニアリング
    • 準備されたデータをもとに新しい列をつくって特徴量にくわえること
    • 散布図から非線形性が疑われたため、二乗項を追加した
    • 2乗した列をつくり、それを新しい特徴量にして再学習

x["RM2"]=x["RM"]**2

#RM列を2乗して新しい列に追加

s1,s2=learn(x,t)

print(s1,s2)

  • 交互作用特徴量

特徴量同士を組み合わせて新しい特徴量を作る

x["RM*LSTAT"]=x["RM"]*x["LSTAT"]

x.head(3)

s1,s2=learn(x,t)

print(s1,s2)

  • テストデータで結果を検証

#訓練データと検証データを合わせて再学習

sc_model_x2=StandardScaler()

sc_model_x2.fit(x)

#StandardScalerオブジェクトのfitメソッドを使って、引数xの平均値と標準偏差を計算し、

#scaler に学習させて内部パラメータとしてsc_model_x2に保持させる

sc_x=sc_model_x2.transform(x)

#sc_model_x2のデータを使ってxを標準化し、sc_xに代入する

 

model=LinearRegression()

model.fit(sc_x,t)

 

# test データの欠損値を、学習用データ(train_val)の平均値で補完する

# 学習時と同じ基準で欠損補完を行うため

test2 = test.fillna(train_val.mean())

 

# 説明変数(特徴量)として使用する列だけを取り出す

x_test = test2.loc[:, ["RM", "LSTAT", "PTRATIO"]]

 

# 目的変数(正解データ)を取り出す

# ※ score() では Series の方が望ましいが、今回は DataFrame でも動作している

y_test = test2"PRICE"

 

# RM の2乗項(非線形関係を捉えるための特徴量)

x_test["RM2"] = x_test["RM"] ** 2

 

# LSTAT の2乗項

x_test["LSTAT2"] = x_test["LSTAT"] ** 2

 

# PTRATIO の2乗項

x_test["PTRATIO2"] = x_test["PTRATIO"] ** 2

 

# RM と LSTAT の交互作用項

# 2つの変数の組み合わせ効果をモデルに学習させるため

x_test["RM*LSTAT"] = x_test["RM"] * x_test["LSTAT"]

 

# StandardScaler を fit したときと「同じ列・同じ順序」に揃える

# feature_names_in_ は、sc_model_x2 が学習時に受け取った列名の一覧

x_test = x_test[sc_model_x2.feature_names_in_]

 

# 学習時に計算した平均・標準偏差を使って、テストデータを標準化する

sc_x_test = sc_model_x2.transform(x_test)

 

# 標準化済みテストデータを用いてモデルの決定係数(R^2)を計算する

model.score(sc_x_test, y_test)

感想

大分複雑になってきました。前処理やチューニングは、やっている最中はなにをしているか理解できますが、さてテストとなると、ここまでやってきたことを忘れています。手順をきっちり覚えなくてはなりません。

プログラミング学習_機械学習4不均衡なデータの決定木モデル

前回のまとめから、付け加えた方法のみまとめます。

Titanic データは生存者と非生存者の数に偏りがあるため、決定木ではclass_weight="balanced" を指定して学習を行った。

  • 文字列をダミー変数化する
    • sckit_learnでは特徴量に文字列を含む列を使えない
    • それを0と1の数値に変換する。それをワンホットエンコーデイングという
    • 文字列の値が3種以上あっても、0,1,2という値にしてはいけない。それを元にした計算が意味をなさなくなるから

書き方

pd.get_dummies(df[“列名”],drop_first=○○,dtype=int)

#drop_fist=Trueで、データの種類数-1のダミー変数列を作る。drop_first=Falseでデータの種類数のダミー変数列を返す

male=pd.get_dummies(df2["Sex"],drop_first=True,dtype=int)

male

pd.get_dummies(df2["Embarked"],drop_first=True,dtype=int)

x_temp=pd.concat([x,male],axis=1)

#ダミー変数化したデータフレームをもとのデータフレームにくっつけて新しいデータフレームを作る

#axis=1は横方向に連結

x_new=a_temp.drop("sex",axis=1)

#もとの列を削除する

  • 特徴量重要度

書き方

モデルの変数.feature_importances_

model.feature_importances_

pd.DataFrame(model.feature_importances_,index=x_temp.columns)

#.sort_values(ascending=False)を後ろにつけると並び替えされる

#分かりやすく整理するためにデータフレーム化する

#値が高いほど重要度が高い

 

感想

今回のはかなり勉強になりました。文字でカテゴリ化したデータは0か1のワンホットの数値データに変える。するとsckitlearnで計算ができる。word2vecもはじめの処理で単語をワンホットベクトルにしますが、それも文字を計算できる数値にかえたということですね。

プログラミング学習_データのグルーピング

データのグルーピングを行います。(226頁)これで最終章です!

 

  • クラスタリング 226
    • クラスタリングclustering とは、データの類似性に基づいてデータをクラスタ(グループ)に分ける手法
    • クラスタリングには次のような分析手順がある
    • クラスタリングの種類
    • scikit-learn
      • scikit=learnとは、様々な機械学習の分析手法を適用できるライブラリ
      • モジュールの一例
        • K-means法クラスタリング:cluster.KMeans
        • 分類(ロジスティック回帰):linear_model.LogisticRegression
        • 回帰分析(線形回帰):linear_model.LinearRgression
      • K-means法
        • K-means法とは、各データ点とその所属クラスタの重心とのユークリッド距離の二乗和(SSE)を最小化するように、クラスタ割当とクラスタ中心を反復的に最適化する手法である。
        • SSE(Sum of Squared Errors:二乗誤差和)とは、すべてのデータ点について“その点と、割り当てられたクラスタ中心との距離の2乗”を合計したもの。
        • K-meansは SSEを “最小” にするようにクラスタ割当と中心位置を同時に最適化する。
        • K-meansはユークリッド距離の二乗を利用する。ユークリッド距離とは2点間の距離のこと。
        • K-means法のときは、データの標準化が必要。なぜなら列ごとのデータの数値の大きさが異なると、小さなデータが反映されないことになるから。標準化はfrom sklearn.preprocessing import StandardScalerdのStandardScalerwを使う。
        • 標準化(standardization)とは「列ごとに、平均0・分散1になるように数値のスケールをそろえる処理」のこと
        • クラスタリングの結果を固定するにはfitメソッドの実行時にキーワード引数random_stateで任意の数値を設定する
        • KMeans は、各クラスタの中心(centroid)を ランダムに初期化し、データをクラスタに割り当て、中心を更新して再計算し、収束するまで繰り返すというふうに働く
        • この (1)の初期位置がランダム なので、同じデータでも実行するたびにクラスタが変わる可能性がある。
        • そのためrandom_stateで初期値(乱数の種)を固定すると、計算の結果が同じになる

書き方

変数名=KMeans(n_clusters=クラスタ数)# KMeansオブジェクトを作る

変数名.fit(X=クラスタリングの対象とするデータ)

データフレーム[“列名”]=変数名.labels_

 

#始める前のセット

import pandas as pd

import matplotlib.pyplot as plt

from sklearn.cluster import KMeans

from pathlib import Path

 

plt.rcParams["font.family"]="MS Gothic"

 

path=r"パス"

df_order=pd.read_csv(path,dtype="object")

df_order

 

df_order"惣菜販売額","弁当販売額"=df_order"惣菜販売額","弁当販売額".astype("int32")

df_order.dtypes

 

kmeans=KMeans(n_clusters=3,random_state=0)

#クラスタ数3,乱数の初期値を固定したKMeansオブジェクトを作る

kmeans.fit(X=df_order.iloc[:,3:])

#クラスタリングの対象のデータを、df_orderのすべての行の3列目以降とする

df_order["クラスタ番号"]=kmeans.labels_

df_order

 

df_order["クラスタ番号"].value_counts()

#データフレームの列名を指定してデータの個数を数えるvalue_countsメソッドを呼び出す

df_order.groupby("クラスタ番号")"惣菜販売額","弁当販売額".mean()

#データフレーム.groupby(“グループ化する列名”)[“集計列名”].集計関数名()の順で書く

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

ax=fig.add_subplot(1,1,1)

df_order[df_order["クラスタ番号"]==0].plot(x="惣菜販売額",y="弁当販売額",kind="scatter",ax=ax,marker="o",color="r")

df_order[df_order["クラスタ番号"]==1].plot(x="惣菜販売額",y="弁当販売額",kind="scatter",ax=ax,marker="o",color="b")

df_order[df_order["クラスタ番号"]==2].plot(x="惣菜販売額",y="弁当販売額",kind="scatter",ax=ax,marker="o",color="y")

plt.legend(["クラスタ番号0","クラスタ番号1","クラスタ番号2"],loc="upper left",bbox_to_anchor=(1,1))

#「今までに描いた 3 本の散布図に対して、左から順にこの名前を凡例として付けてください」

plt.show()  

df_grpbar=df_order.pivot_table("注文番号",aggfunc="count",index="店舗種別",columns="クラスタ番号")

df_grpbar

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

ax=fig.add_subplot(1,1,1)

df_grpbar.plot(kind="bar",ax=ax,color=["r","b","y"])

plt.legend(["クラスタ番号0","クラスタ番号1","クラスタ番号2"],loc="upper left",bbox_to_anchor=(1,1))

plt.show() 

感想

なるほど、表計算からK-means法までのロジックが分かりました。複数の列がある数値データの中心点を何度も計算し直し、そのばらつき具合を指定したクラス多数でわけるということですね。

やっとこの本が終わりました。

プログラミング学習_機械学習3回帰

今日は回帰モデルです。

  • 外れ値の確認
    • 教師あり学習のモデルでは外れ値を含んだデータで機械学習をすると予測精度が下がる可能性がある
    • 機械学習をする前に外れ値の確認が必要
    • データフレームのplotメソッドで散布図を作る

書き方

df.plot(kind=”scatter”, x=”x軸の列名”,y=”y軸の列名”)

df2.plot(kind="scatter",x="SNS2",y="sales")

#plotはデータフレームのメソッド

#グラフの種類とX・y軸をキーワード引数で指定する

以下のようにfor文で書くこともできる

for name in df2.columns:

    if name=="cinema_id" or name=="sales":

        continue

 

   df2.plot(kind="scatter",x=name,y="sales")

#上のコードはifブロックの外に出す。出ないとこれが実行されない。

  • for文は自動的にリスト(ここではdf2のcolumns)の最後まで処理を行う
  • columnsはDataFrameの属性で、列名を保持する pandas.Index オブジェクト
  • Index オブジェクトは、ラベル(軸)を表すための、順序付き・不変(immutable)な配列状オブジェクト
  • continueはその時点での処理を飛ばして、ループの次の繰り返しに移る。しかしループそれ自体は止まらない。
  • nameがcinema_id かsalesの場合は、そもそも以下の処理をしないと言うこと

 

  • 外れ値の削除
    • データフレームのある列を条件付きで参照するとは次のように書く。
      • df[df[“excolumn”]<2]
    • 条件を重ねたいときは&でつなぐ
      • df[(df[“SNS2”]>1000)&(df[“sales”]<8500)]

dropメソッド書き方

行の削除

df.drop(インデックス番号,axis=0)

列の削除

df.drop(“列名”,axis=1)

no=df2[(df2["SNS2"]>1000)&(df2["sales"]<8500)].index

#データフレームのindex属性は各行を一意に識別するための「行ラベルの集合」

#戻り値(参照)の型は、 pandas.Index オブジェクト

#戻り値は基本的にメソッドで使う用語であり、属性の場合は参照という用語を使う

df3=df2.drop(no,axis=0)

#データフレームのdropメソッドで、noの条件に合致した行を削除する

  • 特徴量と正解データの取り出し
    • 特定の行と列を取り出すときは loc[インデックス名,列名]
    • スライス構文で複数のデータを参照できる
      • 書き方はloc[行ラベル範囲, 列ラベル範囲]
      • A:BはAからB、A:はA以上のすべて、:BはB以下のすべて

from sklearn.model_selection import train_test_split

#:はすべての行、"SNS1"から"original"までのすべての列

x=df3.loc[:,"SNS1":"original"]

t=df3["sales"]

x_train,x_test,y_train,y_test= train_test_split(x,t,test_size=0.2,random_state=0)

  • モデルの作成と予測

from sklearn.linear_model import LinearRegression

model=LinearRegression()

model.fit(x_train,y_train)

 

new=pd.DataFrame(150,700,300,0,columns=x_train.columns)

model.predict(new)

  • モデルの評価

平均絶対誤差は、予測と実際の値の誤差を出す

書き方

mean_absolute_rrror(y_pred=予測結果のデータ,y_true=実際のデータ)

from sklearn.metrics import mean_absolute_error

pred=model.predict(x_test)

#x_testのデータを一括で予測する

mean_absolute_error(y_pred=pred,y_true=y_test)

#平均誤差を計算する

#予測結果はpred、実際のデータがy_test

  • 決定係数
    • 決定係数(R-squared)は0~1の間の値をとり、値が高くなるほど、予測値と実測値の誤差が少ない計算式
    • 0.8以上であればよい

model.score(x_test,y_test)

#このscoreメソッドは、決定係数を計算するメソッド

  • 計算式の確認
    • 複数の係数においては、特徴量のスケールが同じ場合、係数の絶対値が大きいほど影響が強いと見なす

print(model.coef_)

#計算式の係数の表示、coef_の出力はモデルに学習させたx_trainの順

print(model.intercept_)

#計算式の切片の表示

データフレーム型にするなら次の通り

tmp=pd.DataFrame(model.coef_)

#データフレームを作成し、そこに計算式の係数を入れる

tmp.index=x_train.columns

#tmpデータフレームのindexをx_trainの列名に指定

#columnsはデータフレーム属性で、列名を参照する

tmp

感想

この線形回帰分析は、最小二乗法を使います。最小二乗法は、データとしてある各点からもっとも差の小さい回帰式を見いだすものです。差を扱うときに負の数になると差が相殺されてしまうし、絶対値だと計算が複雑になるので、差を二乗して計算します。

プログラミング学習_機械学習2

pandasの復習と決定木モデルをします。

 

  • 列分のデータを重複を除いて抽出

df[“列名”].unique()

  • 1列分のデータ別個数の集計

df[“列名”].value_counts()

  • データフレームに欠損値があるか調べるメソッド

df.isnull()

  • 各列の欠損値を合計する

df.isnull().sum()

  • 列単位でどこに欠損値があるか調べるメソッド

df.isnull().any(axis=0)

# axis=0は列方向にという意味

#axis=1は行方向にと言う意味

  • 各列の合計値を求める

df.sum()

  • 欠損値のある行を削除

df.dropna(how=”any”,axis=0)

# how=”any”であると、どれかひとつでも欠損値がある行または列という意味

#axis=0は、欠損値がある行を削除という意味

  • 欠損値の置き換え

df[列名].fillna(穴埋めの値)

df=pd.read_csv(path1)

colmean=df.mean(numeric_only=True)

#各列の平均値を計算してcolmeanに代入

df2=df.fillna(colmean)

df2.isnull().any(axis=0)

#axis=0は列方向に欠損値を確認、axis=1ならば行方向に確認

df["花弁長さ"]=df["花弁長さ"].fillna(0)

#fillnaメソッドは、欠損値を別の値に置き換えたデータフレームを新しく戻り値として返す

#そのため、もとの列に代入する必要がある

  • モデル化する前に、特徴量と正解データを変数化する

xcol=["がく片長さ","がく片幅","花弁長さ","花弁幅"]

#特徴量のカラム名をリスト化する

x=df2[xcol]

#xcolを使ってデータフレームにする

t=df2["種類"]

  • 訓練データとテストデータに分ける

from sklearn.model_selection import train_test_split

x_train,x_test,y_train,y_test=train_test_split(x,t,test_size=0.3,random_state=0)

#テストサイズは0~1.0のなかで指定する

#x_train,y_trainは訓練データ

#x_test,y_testはテストデータ

print(x_train.shape)

print(x_test.shape)

  • データの学習とテスト
  • tree モジュールには、決定木分類(DecisionTreeClassifier)と決定木回帰(DecisionTreeRegressor)が含まれている
    • 決定木回帰(Decision Tree Regression)**とは、入力データを条件分岐(木構造)で分割しながら、連続値(数値)を予測する回帰モデル
      • DecisionTreeClassifier → 予測結果が「カテゴリ(クラス)」
      • DecisionTreeRegressor → 予測結果が「数値(連続値)」

from sklearn import tree
#skllearnライブラリからtree(決定木モデルを作るモジュール)をインポートする

model=tree.DecisionTreeClassifier(random_state=0)

#決定木モデルのDecisionTreeClassifierで乱数を固定してモデルを作る

model.fit(x_train,y_train)

model.score(x_test,y_test)

 

感想

決定木モデルやっとわかってきました。樹形図的なモデルを作って、もっとも適切に分類できる分岐(分かれ方)を作る。分岐のさせ方は、いろいろ分岐を試して(計算して)、ある分岐の時、その分岐した先がどのくらい不純なものを含むのかということを計算し、それを比較して、モデルを作る。乱数は同点の分岐が複数あるとき,特徴量の順序、max_features を制限した場合に使う。再現可能なモデルを作るために、その乱数値を固定する引数がある。

これは単純で視覚的にもわかりやすいモデルだと言うことがわかりました。