書籍URL(第5版)
https://www.oreilly.co.jp/books/9784873117980/
用語集
・サンプル(データポイント)
・個々のデータ(例:顧客)
・テーブルの行
・特徴量
・個々のデータの特性(名前、性別、年齢)
・テーブルの列
・疎行列(sparse行列)
・成分のほとんどがゼロである行列
・ラベル
関連:クラス分類
説明:特定のデータポイントが属する種類
・訓練データ/訓練セット
機械学習モデルの構築に用いるデータセット
→ 主に全データの75%を使う
・テストデータ/テストセット
機械学習モデルの評価に用いるデータセット
→ 主に全データの25%を使う
・正則化
モデルの過剰適合などを防止するために罰則を設ける
正則化が強いと適合不足になりやすく、弱いと過剰適合になりやすい
種類:L1正則化、L2正則化など
学習モデルの種類
・K-最近傍法
・線形回帰
・リッジ回帰
・ロジスティック回帰
※回帰ではなくクラス分類アルゴリズムに分類される
・線形サポートベクタマシン
・ナイーブベイズクラス分類器
その他
・訓練データとテストデータのスコアが近い場合は適合不足の可能性が高い
p10 1.4.5
■サンプル修正
誤:from IPython import display
正:from IPython.display import display
■補足
「display(xxx)」「display.display(xxx)」に変更しても良い
p19,p20
■サンプル修正
※既存のコードでも問題なく動作はするけど廃止予定のメソッドを使っているようで警告がでる。
このため、少しだけ修正
# 元々:pd.scatter_matrix(引数は同じ)
grr = pd.plotting.scatter_matrix(
frame=iris_dataframe,
c=y_train,
figsize=(15,15),
marker='o',
hist_kwds={'bins': 20},
s=60,
alpha=.8,
cmap=mglearn.cm3)
#Jupyter Notebookを使用していない場合は以下を追加する
#
# import matplotlib.pyplot as plt
# ...
# plt.show()
■「pd.plotting.scatter_matrix」について
※matplotlib,pandasを使いこなすには時間かかりそうだ。
気が向いたらチュートリアルから進めていくことにする。
・APIドキュメントページ
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.plotting.scatter_matrix.html
・Matlibplot.pyplot.scatterについて
・Matlibplotのカラーマップについて
https://matplotlib.org/api/_as_gen/matplotlib.colors.Colormap.html#matplotlib.colors.Colormap
スカラをRGBAにマッピングするための基本クラス
データ(float型)をカラーマップが表現するRGBAに変換する
データは0~1の範囲
データの0~1にするには「matplotlib.colors.Normalize」を使用する
・Matlibplotのマーカーの種類について
https://matplotlib.org/api/markers_api.html
・メモ
frame | データフレーム |
c |
マーカー(点)の色 |
figsize |
図のサイズ |
marker | matlibplotで使用するマーカーの種類 文字列型 |
hist_kwd | ??? |
s | マーカーのサイズ |
alpha | 全体に適用するアルファ値 float型 任意 |
cmap |
カラーマップのインスタンス又は登録名 |
p25
scikit-leanの基本的な流れ
1.訓練(fit)
2.訓練に基づいて予測実行(predict)
3.テストデータを利用して正答率を算出する(score)
p34
pythonに関するメモ
・numpy.bincount
https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.bincount.html
負でない整数配列の出現回数をカウントする。
# 例1
[In]
d = np.array([0,0,1,1,1])
print(np.bincount(d))
[Out]
# 0:2個、1:3個
[2,3]
# 例2
[In]
d = np.array([1,1,2,4])
print(np.bincount(d))
[Out]
# 0:0個、1:2個、2:1個、3:0個、4:1個
[0,2,1,0,1]
・zip(組み込み関数)
https://www.programiz.com/python-programming/methods/built-in/zip
要素を集約するイテレータを作成して、タプルのイテレータを返す
下記サンプルではlist関数でイテレータを配列化している。
# パラメータなし
[In]
hoge = zip()
print(list(hoge))
[Out]
[]
# 配列1つ
[In]
names = ['banana','apple']
print(list(zip(names)))
[Out]
[('banana',), ('apple',)]
# 配列2つ
[In]
names = ['banana','apple']
price = [10,20]
print(list(zip(names,price)))
[Out]
[('banana', 10), ('apple', 20)]
# 配列3つ
[In]
names = ['banana','apple']
price = [10,20]
limit = [20190101,20190102]
print(list(zip(names,price,limit)))
[Out]
[('banana', 10, 20190101), ('apple', 20, 20190102)]
# サイズ違い
[In]
names = ['banana','apple','lemon','orange']
price = [10,20,30]
limit = [20190101]
print(list(zip(names,price,limit)))
[Out]
# 一番数が少ない配列に合わせられる
[('banana', 10, 20190101)]
p53周辺
・numpy.reshape
https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.reshape.html
配列の形状を変化させる
[In]
data = np.arange(1,5)
print("original:{}".format(data))
# tuple(n,m,...) : n:1次元目の数,m:2次元目の数,...
# -1を指定した場合は自動判断
# -1は1箇所のみ指定可能
# numpy.reshape(data,(-1,1))でもよい
data.reshape((-1,1))
print("reshape:{}".format(data))
[Out]
original : [1,2,3,4,5]
reshape: [[1],[2],[3],[4],[5]]
# 補足
# 上記例では1次元配列を多次元配列にしているがその逆も可能
p60
・In[43] 誤記?
C=0.01 → C=0.001
・In[44] pythonメモ
logreg.coef_.T
→「.T」:転置
p69
・numpy - 重複データを除去
[In]
hoge=np.array([0,1,0,1])
print(np.unique(hoge))
[Out]
[0 1]
・numpy - 条件を指定してデータを抽出する1
[In]
data=np.array([0,1,0,1])
print(data == 0)
[Out]
[ True False True False]
・numpy - 条件を指定してデータを抽出する2
[In]
data=np.array([
[0,1,0,1], # True
[1,0,1,1], # False
[0,0,0,1], # True
[1,0,1,0] # False
])
print(data[np.array([True,False,True,False])])
[Out]
[[0 1 0 1]
[0 0 0 1]]
・書籍の例
# 書籍引用
counts[label] == X[y == label]
"""
1ループ目
X[np.array([0,1,0,1]) == 0]
→ X[np.array([True,False,True,False])]
2ループ名
X[np.array([0,1,0,1]) == 1]
→ X[np.array([False,True,False,True])]
よって、「...sum(axis=0)により」クラス(0or1)毎+特徴量毎の非ゼロ1の数が集計できる。
"""
・numpy - sumの引数(axisについて)
こちらのサイト様の説明がかなりわかりやすい。
https://deepage.net/features/numpy-axis.html
[In]
X = np.array([1,2,3])
print(X.sum(axis=0))
# print(X.sum(axis=1)) ← エラー
X = np.array(
[
#↓axis=0 この方向に加算する
[1,2,3], #← axis=1 この方向に加算する
[4,5,6]
]
)
print(X.sum(axis=0))
print(X.sum(axis=1))
# 3次元配列以降も同様なので省略
[Out]
6
[5 7 9]
[ 6 15]
・書類引用+読み方
~非ゼロが1回である2番目の~
→ 「~非ゼロが1回である。2番目の~」
無駄に悩んでしまったけどこう区切れば納得。
p70
・サンプル[In55]を実行するとエラーが出る場合の対処
1.Anaconda Promptを開いて「pip install graphviz」を実行する
2.Jupyter Notebookを再起動する
・上記の方法で駄目だった場合
1.Anaconda Promptを開いて「conda install python-graphviz」を実行する
2.Jupyter Notebookを再起動する
p92
・python 配列の結合(axis=1方向):numpy.hstack
https://docs.scipy.org/doc/numpy/reference/generated/numpy.hstack.html
p104
・numpy.tanh(双曲正接関数)
https://docs.scipy.org/doc/numpy/reference/generated/numpy.tanh.html?highlight=tanh
結果の値範囲:-1~1
・numpy.maxinum
https://docs.scipy.org/doc/numpy/reference/generated/numpy.tanh.html?highlight=tanh
二つの配列を比較してより大きいほうの値を抽出した配列を作成する
※numpy.maxとは別物
[In]
import numpy as np
d1=[1,2,3]
d2=[5,1,4]
print(np.maximum(d1,d2))
d3=[1,2,-1]
print(np.maximum(d3,0))
[Out]
[5 2 4]
[1 2 0]
書籍のIn[89]の例では配列の中の0より小さい値を「0」にした配列を生成している。