編集履歴
2020.8.11 表が見づらいのでスプレッドシートのリンクを共有致します。
はじめに
本記事は2020年6月8日から始まったPython3 エンジニア認定データ分析試験の知識を整理したものです。
プライム・ストラテジー様の模擬試験や様々なWebページからの情報を整理しています。
記事の中で「教科書」と記しているのは、主教材となっている以下の書籍のことを指します。
主教材:
2018年9月19日発売(税込2,678円)
「Pythonによるあたらしいデータ分析の教科書」(翔泳社)
著者:寺田 学、辻 真吾、鈴木 たかのり、福島 真太朗(敬称略)
※まだ整理途中であるため、フォーマットが汚い等のご指摘はスルーさせていただくこともございます。
※内容的な誤り、こんなことも載せたほうがよいのでは、といったご指摘は大歓迎です。
出題範囲と出題配分
出題範囲 | 出題数 | 出題配分 | ||
---|---|---|---|---|
1 | データエンジニアの役割 | 2 | 5.00% | |
2 | Pythonと環境 | |||
1 | 実行環境構築 | 1 | 2.50% | |
2 | Pythonの基礎 | 3 | 7.50% | |
3 | Jupyter Notebook | 1 | 2.50% | |
3 | 数学の基礎 | |||
1 | 数式を読むための基礎知識 | 1 | 2.50% | |
2 | 線形代数 | 2 | 5.00% | |
3 | 基礎解析 | 1 | 2.50% | |
4 | 確率と統計 | 2 | 5.00% | |
4 | ライブラリによる分析実践 | |||
1 | NumPy | 6 | 15.00% | |
2 | pandas | 7 | 17.50% | |
3 | Matplotlib | 6 | 15.00% | |
4 | scikit-learn | 8 | 20% |
学習方法
- 主教材を読んで写経
- プライム・ストラテジー社様の模擬試験を解いてわからない点を整理
- PyQの「Python 3 エンジニア認定データ分析試験 PyQクエスト対応」を解く
出題範囲に対応した知識の整理
※表が見づらいので、こちらをご覧ください。
大項目 | 小項目 | 概要 | 詳細 | 参考 | |
---|---|---|---|---|---|
2 | Pythonと環境 | pip | pipコマンドは、The Python Package Index に公開されているPythonパッケージのインストールなどを行うユーティリティである。パッケージをインストールするにはpip installコマンドを使用する。 | ||
pipのUオプションについて Ex.) pip install -U numpy pandas |
pipコマンドは-Uオプションをつけることでインストールするライブラリが最新版に更新されます。 明示的に最新版をインストールするには、このようになります。 |
||||
PEP8 | PEP8は標準のコーディング規約。同一モジュールの場合は複数インポートを許容するが、モジュールが異なる場合は改行する。 | [Pythonコーディング規約]PEP8を読み解く - Qiita https://qiita.com/simonritchie/items/bb06a7521ae6560738a7 | |||
ログレベル | python のロギングには、5 つのレベルがある。 1. CRITICAL 2. ERROR 3. WARNING 4. INFO 5. DEBUG |
||||
便利なモジュール | pickleモジュールは、Pythonのオブジェクトを直列化してファイルなどで読み書きできるようにすることができる。pickle化できるものとしてブール値や数値、文字列などがある。 ファイルのパスを扱うにはpathlibモジュールが便利である。globメソッドではファイル名をワイルドカード(*)で指定することもできる。 |
||||
ravelとflattenは配列を一次元化する関数。ravel()は可能な限りビューを返すが、flatten()は常にコピーを返す。reshape()もreval()と同様、可能な限りビューを返す。 | 配列を別の変数に代入した場合、代入された変数はもともとの配列を参照している。別オブジェクトとして生成したい場合はcopy()もしくはdeepcopy()を使う。 ※numpyのravelとflattenは配列を一次元化する関数。ravel()は可能な限りビューを返すが、flatten()は常にコピーを返す。reshape()もreval()と同様、可能な限りビューを返す。 |
||||
データの読み書き | バイナリファイルからのデータ読み込みはopenメソッドのbオプションでファイル記述子を返し、read()で読み込み、write()で書き込み | ||||
stripメソッド Ex.) bird = ' Condor Penguin Duck ' print("befor strip: {}".format(bird)) print("after strip: {}".format(bird.strip())) |
両端の空白文字がさ削除されます。 | ||||
正規表現 . 任意の一文字 a.c abc, acc, aac ^ 行の先頭 ^abc abcdef $ 行の末尾 abc$ defabc * 0回以上の繰り返し ab* a, ab, abb, abbb + 1回以上の繰り返し ab+ ab, abb, abbb ? 0回または1回 ab? a, ab {m} m回の繰り返し a{3} aaa {m,n} m〜n回の繰り返し a{2, 4} aa, aaa, aaaa [★] ★のどれか1文字 [a-c] a, b, c ★ |
★ ★のどれか a | b a, b | |||
正規表現 特殊シーケンス \d 任意の数字 [0-9] \D 任意の数字以外 [^0-9] \s 任意の空白文字 [\t\n\r\f\v] \S 任意の空白文字以外 [^\t\n\r\f\v] \w 任意の英数字 [a-xA-Z0-9_] \W 任意の英数字以外 [\a-xA-Z0-9_] \A 文字列の先頭 ^ \Z 文字列の末尾 $ |
|||||
正規表現 find() / findall() → それぞれ1つもしくは全てのマッチする部分文字列をリストで返す match() → 文字列の先頭がマッチするか確認する fullmatch() → 文字列全体がマッチするかチェック search() → 先頭に限らずマッチするかチェックする。文字列中の一部を抜き出したい場合に使う replace() → 文字列の置換 sub() → 文字列の置換。置換された文字列が返される。 subn() → 置換処理された文字列(sub()の返り値と同じ)と置換された部分の個数(パターンにマッチした個数)とのタプルを返す。 match/searchはマッチオブジェクトを返す。マッチオブジェクトは以下のメソッドが使える。 マッチした位置を取得: start(), end(), span() マッチした文字列を取得: group() 各グループの文字列を取得: groups() ※正規表現パターンの文字列中の部分を括弧()で囲むと、その部分がグループとして処理される。このとき、groups()で各グループにマッチした部分の文字列がタプルとして取得できる。 subは括弧()でグルーピングした場合、置換後の文字列の中でマッチした文字列を使用することができる。 デフォルトでは\1, \2, \3...が、それぞれ1つ目の()、2つ目の()、3つ目の()...にマッチした部分に対応している。raw文字列ではない通常の文字列だと'\1'のように\をエスケープする必要があるので注意。正規表現パターンの()の先頭に?Pを記述してグループに名前をつけると、\1のような番号ではなく\gのように名前を使って指定できる。 |
re.search("category/(.+?)/", "https://foo.com/category/books/murakami").group(1) # 取得した文字列:'books' >>> text = "123456abcedf789ghi" >>> matchobj = re.search(r'[a-z]+', text) >>> if matchobj: ... print(matchobj.group()) ... print(matchobj.start()) ... print(matchobj.end()) ... print(matchobj.span()) ※re.search は最初にマッチした文字列の情報しか取得できないことには注意が必要です。 replaceは対象の文字列.replace(置換される文字列, 置換する文字列 [, 置換回数])の文法。 >>> raw_abc = r"aaaaabbbbbccccc" >>> rep_raw_abc = raw_abc.replace("c", "C") >>> print("変更前:",raw_abc, "変更後:",rep_raw_abc) 変更前: aaaaabbbbbccccc 変更後: aaaaabbbbbCCCCC re.sub(正規表現, 置換する文字列, 置換される文字列 [, 置換回数])とreplaceの違いに注意。 |
【Python】とっても便利な正規表現! - Qiita https://qiita.com/hiroyuki_mrp/items/29e87bf5fe46de62983c | |||
正規表現のフラグ ASCII文字に限定: re.ASCII 大文字小文字を区別しない: re.IGNORECASE 各行の先頭・末尾にマッチ: re.MULTILINE 複数のフラグを指定 |
|||||
パターンのコンパイル p = re.compile(r'([a-z]+)@([a-z]+).com') m = p.match(s) result = p.sub('new-address', s) |
|||||
仮想環境 | venvは仮想環境毎にインストールするモジュールを隔離することができる。Pythonインタプリタの切替えはpyenvやAnacondaを用いる。 | https://tinyurl.com/y4ypsz9r | |||
%, %%はマジックコマンド。 !でOSのシェルコマンド実行。 Shit + Tabでdocstring表示。 |
Jupyter Notebookのマジックコマンド(マジック関数)の使い方解説 https://miyukimedaka.com/2019/07/28/blog-0083-jupyter-notebook-magic-command-explanation/ | ||||
よく使うマジックコマンド %time:これに続くコードの実行時間を測定し、結果を表示してくれます。 %timeit:これに続くコードの実行時間を何度か測定し、その中で最速であった結果と平均を表示してくれます。 %env:環境変数を取得したり、設定したりすることができます。 %who:現在宣言されている変数を表示してくれます。 %whos:現在宣言されている変数とその型、内容を表示してくれます。 %pwd:現在のディレクトリを表示します。 %history:コードセルの実行履歴を一覧で表示してくれます。 %ls:カレントディレクトリーのファイルを一覧で表示してくれます。 %matplotlib inline:pyplotなどでグラフを描写すると結果が別ウインドーが開きそこに表示されますが、このマジックコマンドを使うとnotebook内にグラフが表示されるようになります。 %%timeit:%timeitの機能をセル内のすべてのコードに適応します。 %%html, %%HTML:htmlのコードの記述、実行を可能にします。 |
|||||
jupyter notebookの保存形式 | notebook形式 (.ipynb) はJSONファイル | ||||
3 | 数学の基礎 | 行列 | 「交換法則:×」,「結合法則:○」,「分配法則:○」 交換法則は必ず成立するとは限らない(成立するものもあることに注意)。 1行/1列はベクトル。 行列の列の数とベクトルのサイズが同じ場合は、これらの掛け算を定義することができ、結果は、元の行列の行数と同じサイズのベクトルになる。 |
||
常用対数と自然対数 | 常用対数とは10を底とする対数のこと。自然対数はeを底とする。 | ||||
ユークリッド距離 | 直線距離 | ||||
マンハッタン距離 | ジグザグ距離(マンハッタンの碁盤の目に由来) | ||||
関数 F(x)を微分して f(x)となったとき、F を f の原始関数、f を F の導関数と呼ぶ。 | |||||
積分 | 積分の範囲が定められていない積分を不定積分という。任意の定数を微分すると0になるため、不定積分には積分定数「C」が通常含まれる。 | ||||
微分と積分 | 微分は傾き、積分は面積と捉えることができる。データ分析や機械学習において、関数の傾きが0となる点は有益な情報として利用される。 | ||||
偏微分 | 2つ以上の変数を持つ多変数関数の微分を偏微分という。偏微分ではどの変数で微分したのかを示すことが必要である。 | ||||
確立 | 12面体のサイコロの期待値は6.5。確立変数については、離散→確立質量関数、連続→確立密度関数 | ||||
0の階乗! | 0!=1 であることに注意。1の対数は0であることも覚えておく。 | ||||
sinとcos | sin/cosはそれぞれ正弦と余弦という。tanは正接。 | ||||
4 | ライブラリによる分析実践 | Numpy | dtype属性 | ndarrayの要素のデータ型を確認できる。 | |
ndarrayの便利な生成方法 # -5~5まで0.1刻みの数値の配列を定義 x = np.arange(-5, 5, 0.1) # 1~10までの等差数列をnumで指定した要素数分生成 np.linspace(1, 10) |
np.linspace(start, stop, num=50, endpoint=True)の文法で生成。numは要素数を指定する。numはデフォルトで50。 | ||||
np.randomモジュール | npは標準モジュールと比べ、stopに指定した値が含まれないことに注意。 random.random() / np.random.rand(size)は0~1の乱数を生成する。 import numpy as np import random print(random.random()) # 0.9733563537374995 print(np.random.rand(3)) # [ 0.69962497 0.61950126 0.7944733 ] print(np.random.rand(2, 3)) # [[ 0.29315148 0.06560949 0.56110618] # [ 0.62784039 0.19218867 0.07087768]] np.random.randn(size)は標準正規分布に従う乱数生成。 print(np.random.randn(3, 3)) #標準正規分布の3×3配列 # [[-0.52434526 0.16597271 -2.22295048] # [ 0.46995083 -0.64576356 -2.73155503] # [ 1.04575168 0.05712791 -0.46522963]] 正規分布に従う乱数を生成したい場合は以下のようにする。 np.random.normal(mu, sd, 10000) 整数の乱数を生成する場合は random.randint(low, high, size) np.random.randint(1, 10, 2) #1以上10未満の整数2個のndarrayを生成。 np.random.randint(1, 10, (2, 3) #2行3列のndarrayを生成。 np.random.randint(2, size=8) #highを省略すると、lowの値をhigh扱い。 # array([1, 0, 0, 0, 1, 1, 1, 0]) np.random.randint(1, size=8) #1未満の整数、つまり0のみ。 # array([0, 0, 0, 0, 0, 0, 0, 0]) choichは標準モジュールと以下の違いがある。 random.choice(seq) seqから1個選択 np.random.choice(a) aから複数個選択 seq1=[0、1、2、3] random.choice(seq1) #1回チョイス random.choice("hello") #5文字の中から1文字チョイス np.random.choice(seq1, 4) #重複ありで4回チョイスした配列 np.random.choice([2, 4, 6],2) #重複ありで2回チョイスした配列 np.random.choice([0, 1], (3, 3)) #size3×3の配列に0,1を埋める np.random.choice(5, 2) #np.randint(0, 5, 2)と同義 |
NumPyの使い方(12) 乱数、random - Remrinのpython攻略日記 http://python-remrin.hatenadiary.jp/entry/2017/04/26/233717 | |||
1次元配列への変換 | 2次元のNumPy配列を1次元に変換するにはravelメソッドまたはflattenメソッドを用いることができる。ravelメソッドは参照を返し、flattenメソッドはコピーを返す。 | ||||
コピーと参照 a = np.array([1, 2, 3]) b = a ① b = a.copy() ② |
①は参照、②はコピーになる。Python標準のリストをスライスするとコピーが渡されるが、Numpyのスライスは参照が渡されることに注意。 | ||||
行列の分割 a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) first1, second1 = np.vsplit(a, [2]) first2, second2 = np.hsplit(second1, [2]) print(second2) |
vpslit関数では行方向、hsplit関数では列方向に行列を分解します。 | ||||
print文の表示について import numpy as np a = np.array([[1, 2, 3], [4, 5, 6]]) b = np.array([7,8,9]) print(a[-1:, [1,2]], b.shape) |
[[5 6]] (3,) aはa[-1:, [1,2]]で最後の行([4,5,6)の[1,2]なので5,6を抽出。bはカッコが1つなので1次元であることに注意。 |
||||
np.arangeが生成する要素数 | x = np.arange(0.0, 1.5, 0.1)だとarray([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. , 1.1, 1.2, 1.3, 1.4])で15個。センターが15だとその10倍だから150。np.sin(x)は弧度法のラジアンで処理する。 | ||||
pandas | 日付配列 dates = pd.date_range(start="2020-01-01", end="2020-12-31") print(dates) |
date_range()で日付配列を生成する。startとendで開始、終了日時を指定できる。 | |||
DataFrameの結合 連結: データの中身をある方向にそのままつなげる。pd.concat, DataFrame.append 結合: データの中身を何かのキーの値で紐付けてつなげる。pd.merge, DataFrame.join |
pd.concat([df1, df2])は縦方向の結合、横方向に結合したい場合はaxis=1をつける。何も指定しないと完全外部結合になるため、内部結合にしたいならjoin=innerをつける。join_axes=[df1.index]のように結合行/列を指定することも可能。 縦方向にはシンプルにdf1.append(df2)として連結することもできる。df2の箇所をSeriesにすると行追加。ignore_index=Trueを指定しないとindexはそのままに連携されることに注意。 結合はmergeによっておこなう。文法はpd.merge(left, right, on='key', how='inner')。howはinner/left/right/outerを指定可能。複数のkeyで結合する際はonにリストを渡す。indexをキーとして結合したい場合はDataFrame.joinが便利。規定は左外部結合となるがhowで変更可能(left.join(right, how='inner'))。 |
Python pandas 図でみる データ連結 / 結合処理 - StatsFragments http://sinhrks.hatenablog.com/entry/2015/01/28/073327 | |||
read_html() | tableが複数ある場合はDataFrameのリストとして取得する | ||||
欠損値処理 | fillna()は、引数をmethod = 'ffill', method = 'bfill'と指定することで、欠損した要素に同じ列内の別の値を格納することができます。method = 'ffill'とした場合は、添え字が小さい要素に格納されていた値で、method = 'bfill'とした場合は、添え字が大きい要素に格納されていた値で欠損値を穴埋めします。 data['Age'].fillna(20) # 列Ageの欠損値を20で穴埋め data['Age'].fillna(data['Age'].mean()) # 列Ageの欠損値をAgeの平均値で穴埋め data['Age'].fillna(data['Age'].median()) # 列Ageの欠損値をAgeの中央値で穴埋め data['Age'].fillna(data['Age'].mode()) # 列Ageの欠損値をAgeの最頻値で穴埋め |
Pandasで欠損値処理 - Qiita https://qiita.com/0NE_shoT_/items/8db6d909e8b48adcb203 | |||
NumpyとPandasの相互変換 | pandas→numpy変換はDataFrameのvalues属性で、逆はndarrayをpd.DataFrame()の引数とすることで変換できる。 numpyに変換する際はインデックス名、カラム名は保持されない。 |
||||
pd.describe() | describeは各列毎に平均や標準偏差、最大/最小、最頻値を取得できる。 stdは標準偏差。topは最頻値。 | https://tinyurl.com/y3gn3dz4 | |||
groupbyとGrouperの使い方 import numpy as np import pandas as pd np.random.seed(123) dates = pd.date_range(start="2017-04-01", periods=365) df = pd.DataFrame(np.random.randint(1, 31, 365), index=dates, columns=["rand"]) df_year = pd.DataFrame(df.groupby(pd.Grouper(freq='W-SAT')).sum(), columns=["rand"]) |
Grouperはfreqで頻度を指定するなどして柔軟にグルーピングができる。 ※5行目は、日付をインデックスとするDataFrameを作成している。rand列の各値は、1から30までのランダムな整数となる。 |
||||
Matplotlib | MATLABスタイルとOOP(オブジェクト指向)スタイル | 前者の方がコードは短いが細かい指定はできない。基本、後者を使うべき。 単体のグラフを作成する場合、ユーザーは Figure や Axes を準備する必要はありません。これらのオブジェクトは自動生成されます。 |
|||
描画オブジェクト、サブプロットオブジェクトの生成 fig, axes = plt.subplots(2) |
左記のとおり、一括でfigとaxesを生成できる。fig.add_subplot()でfigに対して個別にサブプロットを生成していくことも可能。 ■fig,axを個別に作る場合 # Axesを配置する領域を作成 fig = plt.figure(facecolor = "lightgray") # FigureにAxesを追加 ax = fig.add_subplot(111) subplots(2)とするとサブプロットは2行、ncol=2のようにすると2列となる。 |
||||
複数のサブプロットの配置方法 ax_1 = fig.add_subplot(221) ax_2 = fig.add_subplot(222) ax_3 = fig.add_subplot(223) # 3行2列目にあるAxesにデータをプロット ax[2, 1].plot(x, y) |
pyplot.subplots() を使うと、複数の Axes オブジェクトを一度に生成できます。第 1 引数 nrows と 第 2 引数 ncols には、それぞれ Axes の行方向の数と列方向の数を渡します。 | [Matplotlib] OOP と MATLAB スタイル https://python.atelierkobato.com/matplotlib/ | |||
軸の設定 # Axesの設定 ax.grid() # グリッドを表示 ax.set_title("Axes sample", fontsize=14) # タイトルを表示 ax.set_xlim([-5, 5]) # x軸の範囲 ax.set_ylim([-5, 5]) # y軸の範囲 |
|||||
Figureオブジェクトの書式設定 # Figureオブジェクトの作成と書式設定 fig = plt.figure( # サイズ figsize = (5, 5), # 塗り潰しの色 facecolor = "lightgray", # 枠線の表示 frameon = True, # 枠線の色 edgecolor = "black", # 枠線の太さ linewidth = 4) |
|||||
# FigureにAxes(サブプロット)を追加 ax = fig.add_subplot( #行数と列数、Axes番号 111, # 塗り潰しの色 facecolor = "lightgreen", # x軸とy軸の範囲 xlim = [-4,4], ylim = [0,40]) |
|||||
グラフの表示 plt.show() |
showメソッドでグラフを表示する。 | ||||
import matplotlib.pyplot as plt fig, ax = plt.subplots() x = [1, 2, 3] y1 = [10, 2, 3] y2 = [5, 3, 6] labels = ['Setosa', 'Versicolor', 'Virginica'] ax.bar(x, y_total, tick_label=labels, label='y1') ax.bar(x, y2, label='y2') ax.legend() plt.show() |
y1は変数として使われていない点に注意 | ||||
import numpy as np import matplotlib.pyplot as plt np.random.seed(123) mu = 100 sigma = 15 x = np.random.normal(mu, sigma, 1000) fig, ax = plt.subplots() n, bins, patches = ax.hist(x, bins=25, orientation='horizontal') for i, num in enumerate(n): print('{:.2f} - {:.2f} {}'.format(bins[i], bins[i + 1], num)) plt.show() |
binsのデフォルト値は10。教科書P192参照。返り値としてのbinsは境界の値で、bin数+1となる。 変数muは平均値、変数sigmaは標準偏差を意味する。 ヒストグラムは横向きに描画される。 histメソッドの返り値が格納される「n, bins, patches」のうち「bins」にはビンの境界の値が入っており、その個数は26である。 このスクリプトを実行するとヒストグラムに加えて度数分布表が出力される。 左記のprint文の箇所が度数分布表の表示になっている。 51.53 - 55.62 2.0 55.62 - 59.70 3.0 59.70 - 63.78 6.0 63.78 - 67.86 7.0 67.86 - 71.94 16.0 71.94 - 76.02 29.0 76.02 - 80.11 37.0 |
||||
円グラフ表示 | 教科書P198参照。アス比を保持するには、ax.axis('equal')とする。autopctは各値を%表示できる。強調表示はexplode。 例:plt.pie(x, labels=label, counterclock=False, startangle=90)で真上から時計回りに描く |
https://tinyurl.com/yyl8yml6 | |||
Scikit-learn | DBSCAN | 教師なし学習の1つであるDBSCAN法は密度準拠クラスタリングアルゴリズムであり、特徴量ベクトル間の距離に着眼した手法である。 | |||
分類の評価尺度 Precision(適合率) Recall(再現率) F1 Score Accuracy(正解率) |
PrecisionとRecallはトレードオフの関係にある。そのため、F1 Score指標も併せて見るとよい。 よくあるがん診断の例でいうと、 Precision → 誤診を少なくしたい場合に重視 Recall → 正例の見逃しを避けたい場合に重視 Accuracy → 分類の精度を確認するための一般的な指標 |
機械学習 実践(教師あり学習:分類) - KIKAGAKU https://www.kikagaku.ai/tutorial/basic_of_machine_learning/learn/machine_learning_classification | |||
回帰モデルの評価尺度 | MSE(Mean Squared Error:平均二乗誤差)、RMSE(Root Mean Sqaured Error:平均平方二乗誤差)、MAE(Mean Absolute Error:平均絶対誤差)が有名。 |
https://tinyurl.com/y2xc9c58 https://tinyurl.com/y5k8gc9a いろいろな誤差の意味(RMSE、MAEなど) - 具体例で学ぶ数学 https://mathwords.net/rmsemae#:~:text=MAE%EF%BC%88Mean%20Absolute%20Error%EF%BC%89,-%E3%83%BB%E5%AE%9A%E7%BE%A9%E5%BC%8F%E3%81%AF&text=%E3%83%BB%E5%B9%B3%E5%9D%87%E7%B5%B6%E5%AF%BE%E8%AA%A4%E5%B7%AE%E3%81%A8%E3%82%82%E8%A8%80%E3%81%84,%E3%81%A8%E3%81%97%E3%81%A6%E6%89%B1%E3%81%86%E5%82%BE%E5%90%91%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82 |
|||
Scikit-learnに付属のデータセット load_iris load_boston |
irisは150枚のアヤメの「がく」や「花びら」の長さと幅、そして花の種類が記録されている。説明変数4、目的変数1。bostonは米国ボストン市郊外の地域別に、人口一人当たりの犯罪件数や住居の部屋数の平均などを含む14個の特徴量と住宅価格を記録したデータセットである。 | ||||
決定木 回帰・分類を行うアルゴリズム。解釈が容易で前処理が少なくてすむという強みがある。 |
教科書P235。情報利得=親ノードの不純度-子ノードの不純度の合計 で表され、正であれば子ノードに分割すべき、負であれば分割すべきでないとなる。 | 木構造 (データ構造) - Wikipedia https://ja.wikipedia.org/wiki/%E6%9C%A8%E6%A7%8B%E9%80%A0_(%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0)#%E7%94%A8%E8%AA%9E | |||
SVM マージンが最大となるように決定境界を引く。線形分離不可能なデータを線形分離可能にする手法をカーネルトリックという。 |
from sklearn.svm import SVC svc = SVC() Cはコストパラメータで誤った予測に対するペナルティを意味する。大きすぎると過学習を起こす。gammaはモデルの複雑さを決定する。値が大きくなるほど複雑になり過学習を起こす。 |
||||
シグモイド関数 y = 1 / 1 + exp(x) の形をとる。(0, 0.5)をとおり、0 < y < 1となる。 |
シグモイドは二値分類を行うモデル。3クラス分類であれば、二値分類をクラス数だけ行うことで対応できる。 | ||||
正規化 | 正規化は、平均0分散1にする標準化[StandardScaler]と最大1、最小0にする正規化[MinMaxScaler]が有名。 | ||||
訓練データとテストデータの分割 | from sklearn.model_selection import train_test_split | ||||
線形モデル | 線形モデル(LinearRegression)は説明変数が1つの単回帰と複数の重回帰に分かれる。 | ||||
主成分分析 | 分散が大きくなる方向を探して、元の次元と同じかそれよりも低い次元にデータを圧縮する手法である。 主成分分析(principal component analysis)は、scikit-learnのdecompositonモジュールのPCAクラスを用いて実行することができる。 |
||||
グリッドサーチ from sklearn.datasets import load_iris from sklearn.model_selection import GridSearchCV from sklearn.tree import DecisionTreeClassifier from sklearn.model_selection import train_test_split iris = load_iris() X, y = iris.data, iris.target X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=123) clf = DecisionTreeClassifier() param_grid = {'max_depth': [3, 4, 5]} cv = GridSearchCV(clf, param_grid=param_grid, cv=10) cv.fit(X_train, y_train) y_pred = cv.predict(X_test) |
左記のコードでは、実行するたびに決定木の深さの最適値が変わる可能性がある。再現性をもたせる場合は、以下のようにする。 clf = DecisionTreeClassifier(random_state=0) |
決定木分析のパラメータ解説 – S-Analysis http://data-analysis-stats.jp/2019/01/14/%E6%B1%BA%E5%AE%9A%E6%9C%A8%E5%88%86%E6%9E%90%E3%81%AE%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E8%A7%A3%E8%AA%AC/ | |||
クラスタリング | k-meansは、最初にランダムにクラスタ中心を割り当て、クラスタ中心を各データとの距離を計算しながら修正し、最終的なクラスタ中心が収束するまで再計算を行いクラスタリングする手法である。 クラスタリングには大きく分けて、分割最適型クラスタリングと階層型クラスタリングがあります。分割最適型クラスタリングは、事前にクラスタの良さを測る関数を準備しておいて、その関数の値を最小化するようなクラスタリングを求める手法です。一方で、階層型クラスタリングはクラスタを分割したり併合したりすることによってクラスタを階層的に構築する手法です。 また階層型クラスタリングには、さらに凝集型と分割型があります。凝集型はデータポイント1つ1つをクラスターと考えた状態から始め、類似しているクラスターを逐次的に凝集していく手法です。分割型はデータポイント全体で1つのクラスターと考えた状態から始め、類似していないデータポイント群を逐次的に分割していく手法です。 分割型は凝集型に比べ、計算が多くなる傾向があります。 |
https://tinyurl.com/y6cgp24f https://tinyurl.com/y2df2w4c |