しんせいたろう🐷
    • Create new note
    • Create a note from template
      • Sharing URL Link copied
      • /edit
      • View mode
        • Edit mode
        • View mode
        • Book mode
        • Slide mode
        Edit mode View mode Book mode Slide mode
      • Customize slides
      • Note Permission
      • Read
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Write
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Engagement control Commenting, Suggest edit, Emoji Reply
    • Invite by email
      Invitee

      This note has no invitees

    • Publish Note

      Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

      Your note will be visible on your profile and discoverable by anyone.
      Your note is now live.
      This note is visible on your profile and discoverable online.
      Everyone on the web can find and read all notes of this public team.
      See published notes
      Unpublish note
      Please check the box to agree to the Community Guidelines.
      View profile
    • Commenting
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
      • Everyone
    • Suggest edit
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
    • Emoji Reply
    • Enable
    • Versions and GitHub Sync
    • Note settings
    • Note Insights New
    • Engagement control
    • Make a copy
    • Transfer ownership
    • Delete this note
    • Save as template
    • Insert from template
    • Import from
      • Dropbox
      • Google Drive
      • Gist
      • Clipboard
    • Export to
      • Dropbox
      • Google Drive
      • Gist
    • Download
      • Markdown
      • HTML
      • Raw HTML
Menu Note settings Note Insights Versions and GitHub Sync Sharing URL Create Help
Create Create new note Create a note from template
Menu
Options
Engagement control Make a copy Transfer ownership Delete this note
Import from
Dropbox Google Drive Gist Clipboard
Export to
Dropbox Google Drive Gist
Download
Markdown HTML Raw HTML
Back
Sharing URL Link copied
/edit
View mode
  • Edit mode
  • View mode
  • Book mode
  • Slide mode
Edit mode View mode Book mode Slide mode
Customize slides
Note Permission
Read
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Write
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Engagement control Commenting, Suggest edit, Emoji Reply
  • Invite by email
    Invitee

    This note has no invitees

  • Publish Note

    Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

    Your note will be visible on your profile and discoverable by anyone.
    Your note is now live.
    This note is visible on your profile and discoverable online.
    Everyone on the web can find and read all notes of this public team.
    See published notes
    Unpublish note
    Please check the box to agree to the Community Guidelines.
    View profile
    Engagement control
    Commenting
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    • Everyone
    Suggest edit
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    Emoji Reply
    Enable
    Import from Dropbox Google Drive Gist Clipboard
       Owned this note    Owned this note      
    Published Linked with GitHub
    1
    • Any changes
      Be notified of any changes
    • Mention me
      Be notified of mention me
    • Unsubscribe
    # Kaggleで勝つデータ分析の技術 輪読会 ###### tags: `kaggle` `GTUGGirls` [Git Repository: Winning-Data-Analysis-Techniques-with-Kaggle](https://github.com/shinseitaro/Winning-Data-Analysis-Techniques-with-Kaggle) ## 第2章タスクと評価指標 ### 2.1分析コンペにおけるタスクの種類 - [x] 2.1.1回帰タスク @omohayui - 数値を予測するのが回帰タスク - RMSE,MAE (`2.3.2` で詳しくやる) - RMSE (RootMeanSquaredError:平均平方二乗誤差) - scikitlearnのmetricsモジュールのmean_squared_errorで計算することができる - MAEと比較すると外れ値の影響を受けやすいので、あらかじめ外れ値を除く処理などをしておかないと外れ値に過剰に適合したモデルを作成してしまう可能性がある - MAE (MeanAbsoluteError) - 真の値と予測値の差の絶対値の平均 - 外れ値の影響を低減した形での評価に適した関数 - [x] 2.1.2分類タスク @shinseitaro - 二値分類: - 0もしくは1の2種類のラベルで分ける:F1-score - 0〜1の間の確率を表す数値の予測:logloss / AUC - 多クラス分類 - マルチクラス分類:レコードが複数のクラスのどれかに属する。multi-class logloss - マルチラベル分類:レコードが複数のクラスに同時に属する。(二値分類をクラスの数だけ繰り返す方法が使われる)。mean-F1, macro-F1 - [x] 2.1.3レコメンデーション @kazura - ユーザが購入しそうな商品や反応しそうな広告を予測するタスク - amazonのレコメンドとか有名 - 最近はこの商品を買ったならこちらもどうですかっておすすめされるやつ増えた - 予測提出 - 購入可能性に応じた順位をつける - 順位をつけない - マルチラベル分類と同じ感じ(複数の予測値を提出する) - 商品を購入「する」「しない」の二値分類として解くことが一般的 - 評価指標 - 順位あり:MAP@K - 順位なし:mean-F1, macro-F1 - [x] 2.1.4その他のタスク @omohayui - 物体検出 - 画像に含まれる物体のクラスとその存在する領域を矩形領域で推定するタスク - セグメンテーション - 画像に含まれる物体の存在領域を画像のピクセル単位で推定するタスク ### 2.2分析コンペのデータセット - [x] 2.2.1テーブルデータ @shinseitaro - 行列を持つデータ - テーブルデータのコンペは、 `train.csv` `test.csv` `sample_submission.csv` の3つのファイルを与えられることが最もシンプルでよくあるパタン - `train.csv` `test.csv` の違いは、目的変数の columns があるかないか - `train.csv` `test.csv` で前処理と特徴量を作成して、 - `train.csv` でモデル学習 - `test.csv` で予測 - `sample_submission.csv`形式で提出という流れ - その他のファイルが与えられる場合も多数あり、その時はマージなどの前処理後、特徴量として使う - [x] 2.2.2外部データ @kazura - kaggleでは許可されていないことが多い - 学習済モデルも外部データ扱い - 外部データ許可のコンペでは、Discussionの専用スレッドで共有するルールのことが多い - [x] 2.2.3時系列データ @omohayui - コンペで時系列データは頻繁に出てくるが、タスクやデータの形式によってどのように扱うべきかはさまざま - RecruitRestaurantVisitorForecasting - 飲食店の日別の来客数から将来の来客数を予測するタスク - SantanderProductRecommendation - 月単位の金融商品の購入履歴から最新月の購入商品を予測するタスク - TwoSigmaFinancialModelingChallenge - 金融市場の匿名化された時系列データから、ある変数の将来の値を予測するタスク - CouponPurchasePrediction - 共同購入型クーポンサイトの購入履歴から、将来各ユーザーがどのクーポンを買うか予測するタスク - 時系列データの特徴量の作成やバリデーション方法は3章でやる - [x] 2.2.4画像や自然言語などのデータ @shinseitaro - 本書では、テーブルデータを対象にしていて、画像、動画、音声、波形などの分類、検知は対象外 - しかしコンペでは、こういったデータの分類分析も必要なことがある - 簡単な説明を、3.12.5 と 3.12.8 で行う ### 2.3評価指標 - [x] 2.3.1評価指標(evaluationmetrics)とは @kazura - モデルの性能や予測値の良し悪しを測る指標 - コンペは評価指標に基づいて順位付けがされる - 実務でも役に立つ - 元から評価指標がある場合 - 新しいプロジェクトで評価指標から策定する場合 - [x] 2.3.2回帰における評価指標 @omohayui - RMSE (RootMeanSquaredError:平均平方二乗誤差) - 回帰タスクの中でも代表的な評価指標 - 各レコードの目的変数の真の値と予測値の差の二乗をとり、それらを平均したあとに平方根をとる計算 - RMSEを最小化する予測値は平均値を取る - 最尤推定法とは?(さいゆうかいってなんぞや) - 統計学で、与えられた観測値(標本)から、それらが得られる確率を最大化する確率分布の母数を推定する手法 - MAEと比較すると外れ値の影響を受けやすいので、あらかじめ外れ値を除く処理などをしておかないと外れ値に過剰に適合したモデルを作成してしまう可能性がある - scikitlearnのmetricsモジュールのmean_squared_errorで計算することができる - [x] 2.3.3二値分類における評価指標~正例か負例かを予測値とする場合 @shinseitaro - 二値分類の評価指標 1. 各レコードが正例か、負例かの予測 (←この章で) 2. 各レコードが正例である確率の予測 - **各レコードが正例か、負例か、の予測するための評価指標** 1. **混同行列** 2. **accuracy(正答率)と error late(誤答率)** 3. **precision(適合率)と recall(再現率)** 4. **F1-scoreとFβ-score** 5. **MCC** - ==混同行列== - 予測として真偽値をだし、その真偽値が正しかったかどうかの組み合わせ - ( `偽陽性` `偽陰性` はPCR検査のときに、ホットワードだったね。参考:[検査/東京大学保健センター](https://www.hc.u-tokyo.ac.jp/covid-19/tests/)) 名前|予測値|予測値が正しかったかどうか --- | ---| --- TP(True Positive 真陽性)| 正例 | 正しい TN (True Negative 真陰性)| 負例 | 正しい FP (False Positive 偽陽性)| 正例 | 誤り FN (False Negative 偽陰性)| 負例 | 誤り - マトリックスにするとこういう図になる。 注意: 通常の表現方法と `sklearnのconfusion_matrix` メソッドを使うと要素の配列方法が異なるので注意 ![](https://i.imgur.com/dzyJ8oc.jpg) - [混同行列作成 P68 ch02-02-metrics.ipynb](https://colab.research.google.com/drive/1qFACpdUrjsJ4Qul-3ygCrs7RKIxBbMbu?authuser=1#scrollTo=DapROxgpI1QC) - ==accuracy(正答率)と error rate(誤答率)== - accuracy: 予測が正しい割合 - error rate: 予測が誤っている割合 - $accuracy = {TP + TN \over TP+TN+FP+FN}$ - $error rate = 1 - accuracy$ - 注意:不均衡なデータには性能評価しづらい - 不均衡なデータ:目的変数の割合が均一でない。 - accuracy は 正例である確率が50%以上と50%以下に振り分ける判断能力。モデルの性能を評価するものではない - 例: - 重病の可能性が高い患者のスクリーニング - 重病である割合は0.1%の状況下で、正例である(重病である)確率が5%(以上)ある患者であるかどうか予測したい場合 - この時、予測確率が50%以下であれば負例として予測できない accuracy は不適切 - この状況下では、全部負例と予測するモデルと変わらない - [混同行列作成 P68 ch02-02-metrics.ipynb](https://colab.research.google.com/drive/1qFACpdUrjsJ4Qul-3ygCrs7RKIxBbMbu?authuser=1#scrollTo=DapROxgpI1QC) - ==precision(混合率)と recall(再現率)== - $precision = {TP \over TP+FP}$ - モデルが正と予測したもので、本当に正だったものの割合 - $recall = {TP \over TP+FN}$ - モデルが正と予測したものと、モデルが負だと予測したものの中で、正だった割合 - 0〜1の値とり、1に近ければ近いほど良い - 誤検知を少なくしたい場合は、 precision 重視 - 正例の見逃しを避けたい場合は、 recall 重視 - どちらかを高めようとすると、どちらかが低くなる(トレードオフ) - [PrecisionとRecallがトレードオフとはどういうことなのか? - Qiita](https://qiita.com/dl_from_scratch/items/309f98c11156b4ab6b52) - ==F1-scoreとFβ-score== - F1-score - precision と recall の調和平均 - precision と recall のバランスをとった指標 - よく使う - Fβ-score - F1-score の recallをどれだけ重視するか - $F1 = {2 \times recall \times precision \over recall + precision} = {2 TP \over 2TP + FP + FN}$ - $Fβ = {(1 + β^2) \over {β^2 \over recall} + {1 \over precision}} = {(1 + β^2) \times recall \times precision \over recall + β^2precision}$ - $F1$ の分子にはTPしかないことから、正例と負例を対称に扱っていない - よって何を正にするか、を変えるとスコアも振る舞いも変わる - `sklearn.matrix.f1_score, fbeta_score` - ==MCC== - Matthews Correlation Coefficient - 不均衡なデータに対してモデルの性能を評価しやすい指標 - $MCC = {TP \times TN - FP \times FN \over \sqrt{(TP+FP)(TP+FN)(TN+FP)(TN+FN)}}$ - -1から+1 の数字を返す - -1が逆相関、+1が相関 - `sklearn.metrics.matthews_corrcoef` - [x] 2.3.4二値分類における評価指標~正例である確率を予測値とする場合 @kazura - ==logloss(cross entropy)== - 分類タスクでの代表的な評価指標。 $$ logloss = -{1 \over N}{\displaystyle \Sigma_{i=1}^{n}}{(y_i log p_i + (1-y_i)log(1-p_i))}\\ = -{1 \over N}{\displaystyle \Sigma_{i=1}^{n}}{log p'_i} $$ - $y_i$ は正例かどうかを表すラベル(0が正例、1が負例) - $p_i$ は各レコードが正例である予測確率 - $P'_i$ は真の値を予測している確率 - 真の値が正例 $p_i$ - 真の値が負例 $1-p_i$ - 真の値を予測している確率の対数をとり、符号を反転させた値(ちょっとこの説明何言ってるかわからない) - entropyが0に近いほうが=値が低いほうが良い数値 - 結果が正例であるにもかかわらず、予測が正例であると判断した確率が低かった場合→ペナルティが多く与えられる→値が上がる - モデルを学習する際の目的変数としてもよく使われる - `sklearn.metrics.log_loss` - ==AUC(Area Under the ROC Curve)== - 二値分類における代表的な評価指標 - ROC曲線 - (予測値を正例とする閾値を1から0に動かし、)その時の偽陽性率/真陽性率を(x,y)としてプロットした図 - ROC曲線の下部の面積がAUC - 正例と負例をそれぞれランダムに選んだときに、正例の予測値が負例の予測値より大きい確率としても定義できる $$ AUC = {(y_i=1,y_j=0,y_i>y_j)である(i,j)の組の個数 \over (y_i=1,y_j=0)である(i,j)の組の個数} $$ - 曲線図では改善の結果、どのくらい改善されたかがわかりにくいので、上記の式で考えたほうがわかりやすい - 各レコードの予測値の大小関係のみが値に影響する - 正例が非常に少ない不均衡データの場合、正例の予測値をどれだけ高確率の側に寄せることができるかが大きく影響する - 負例の予測値の誤差の影響はあまり大きくない - 評価指標Gini係数の場合は評価指標がAUCであるのとほぼ同じ - `sklearn.metrics.roc_auc_score` - [x] 2.3.5多クラス分類における評価指標 @omohayui - ==multi-class accuracy== - 二値分類のaccuracyを他クラスへ拡張したもの - 予測が正解であるレコード数をすべてのレコード数で割ったもの - $accuracy = {TP + TN \over TP+TN+FP+FN}$ - 二値分類と同様に `scikit-learn.metrics.accuracy_score` を使う - ==multi-class logloss== - 各クラスの予測確率を提出し、レコードが属するクラスの予測確率の対数をとり符号を反転させた値がスコア - $multiclass logloss = -{1 \over N}\sum_{i=1}^{N} \sum_{m=1}^{M}y_{i,m}\log p_{i,m}$ - M = クラス数 - $y_{i,m}$ = レコードiがクラスmに属する? 1 : 0 - $p_{i,m}$ = レコードiがクラスmに属する予測確率 - 予測値はレコード数×クラス数の行列で提出 - `scikit-learn.metrics.log_loss` を使う - [Colab: multi-class log-loss](https://colab.research.google.com/drive/180zjZT6hZnaNfNTzoisNxzJorZSl3Y2e#scrollTo=0_0nArQ-Ucox) - ▼accuracy と logloss の違いとか -  https://www.atmarkit.co.jp/ait/articles/2103/04/news023.html -  mean-F1 と macro-F1 と micro-F1 -  前述のF1scoreを多クラス分類に拡張したものが、meanF1、macroF1、microF1 -  mean-F1 -  レコード単位でF1scoreを計算し、その平均値が評価指標のスコアになる -  macro-F1 -  各クラスごとのF1scoreを計算し、それらの平均値が評価指標のスコアとなる -  micro-F1 -  レコード×クラスのペアのそれぞれに対してTP、TN、FP、FNのどれに当てはまるかをカウントする -  [Colab: meanF1、macroF1、microF1](https://colab.research.google.com/drive/180zjZT6hZnaNfNTzoisNxzJorZSl3Y2e#scrollTo=QwZ7yqxGnWtV) -  quadratic weighted kappa -  マルチクラス分類でクラス間に順序関係があるような場合に使用 -  $k = 1-{\sum_{i,j}w_{i,j}O_{i,j} \over \sum{i,j}w_{i,j}E_{i,j}}$ -  $O_{i,j}$ :真のクラスがi,予測値のクラスがjのレコード数 -  $E_{i,j}$ :真の値がiである割合×予測値がjである割合×データ全体のレコード数 -  $w_{i,j}$ :真の値と予測値の差の二乗 $(i-j)^2$ -  差が大きい程、この値が跳ねるので、大きく予測を外すと大きなペナルティが課せられる - 図の表を見ると分かりやすい!  - 完全な予測は1,ランダムな予測は0,ランダムよりも悪い予測はマイナスになる - [Colab: quadratic weighted kappa](https://colab.research.google.com/drive/180zjZT6hZnaNfNTzoisNxzJorZSl3Y2e#scrollTo=sbALvS9oTYeV) - [x] 2.3.6レコメンデーションにおける評価指標 @shinseitaro - レコメンデーション(この本を買った人はこの本にも興味があるみたいなやつ) - **MAP@K** Mean Average Precision @ K - 各レコードが一つまたは複数のクラスに属している時に、属している可能性が高いと予測する値をK個予測し、かつ可能性の高い順に並べてその正確性を図る - コード的には ```python K = 3 #各レコードの真の値 y_true = [[1,2], [1,2], [4], [1,2,3,4],[3,4]] #予測値 K=3 なので通常予測値は3個まで、順位を付けて予測 y_pred = [[1,2,4], [4,1,2], [1,4,3], [1,2,3]] ``` - 全コードは: https://colab.research.google.com/drive/1Y6tzm_6LS3XHPRVfmUN-jw6GI68w-jc_?authuser=1#scrollTo=QZB5hWdMNDEX - $MAP@K = {1 \over N}\sum_{i=1}^{N}({1 \over min(m_i, K)}\sum_{k=1}^{K}P_i(k))$ - コードで説明したほうがわかりやすいのでコードで説明します ### 2.4評価指標と目的関数 - [x] 2.4.1評価指標と目的関数の違い @kazura - 目的関数 - モデルの学習において最適化される関数 - (感想)最適化することを目的にする、と言い換えても? - 最小を目指す - 回帰タスク:RMSE / 分類タスク:logloss (のことが多い) - 微分可能なものでなければならないなど、いくつかの制約がある - 評価指標 - モデルや予測値の「性能の善し悪し」を測る指標 - 真の値や予測値から計算できれば特に制約はない - スコアの変化が数学的に扱いにくいなど、目的関数として使おうとしてもうまく使えないものが多い - 目的関数や評価指標は同一のものになることもある - その手のコンペはやりやすい - 同一でないと、評価指標に対してモデルが最適化されないことがある - [x] 2.4.2カスタム評価指標とカスタム目的関数 @omohayui - モデルやライブラリで提供していない評価指標や目的関数をユーザー定義して使用できる - カスタム目的関数を指定: その関数を最小化するように学習が進む - カスタム評価指標を指定: その評価指標を使ったスコアが学習時のモニタリングで表示される - どちらも使用するライブラリのAPIに沿う形で実装する必要がある - [Colab: xgboostにおけるカスタム評価指標とカスタム目的関数の実装例](https://colab.research.google.com/drive/180zjZT6hZnaNfNTzoisNxzJorZSl3Y2e#scrollTo=vtUNEPAgSZ4D&line=1&uniqifier=1) ### 2.5評価指標の最適化 - [x] 2.5.1評価指標の最適化のアプローチ @shinseitaro - [x] 2.5.2閾値の最適化 @kazura - [x] 2.5.3閾値の最適化をoutoffoldで行うべきか?COLUMNoutoffoldとは? @omohayui - [x] 2.5.4予測確率とその調整 @shinseitaro ### 2.6評価指標の最適化の例 - [x] 2.6.1balancedaccuracyの最適化 @kazura - [x] 2.6.2meanF1における閾値の最適化 @omohayui - [x] 2.6.3quadraticweightedkappaにおける閾値の最適化 @shinseitaro - [x] 2.6.4カスタム目的関数での評価指標の近似によるMAEの最適化 @kazura - [x] 2.6.5MCCのPRAUCによる近似とモデル選択 @omohayui ### 2.7リーク(dataleakage) - [x] 2.7.1予測に有用な情報が想定外に漏れている意味でのリーク @shinseitaro - [x] 2.7.2バリデーションの枠組みの誤りという意味でのリーク @kazura ## 第3章特徴量の作成 ### 3.1本章の構成 ### 3.2モデルと特徴量 - [x] 3.2.1モデルと特徴量 @omohayui - [x] 3.2.2ベースラインとなる特徴量 @shinseitaro - [x] 3.2.3決定木の気持ちになって考える @kazura - [x] 3.3欠損値の扱い @omohayui - [x] 3.3.1欠損値のまま取り扱う @omohayui - [x] 3.3.2欠損値を代表値で埋める @shinseitaro - [ ] 3.3.3欠損値を他の変数から予測する @kazura - [ ] 3.3.4欠損値から新たな特徴量を作成する @omohayui - [ ] 3.3.5データ上の欠損の認識 @shinseitaro

    Import from clipboard

    Paste your markdown or webpage here...

    Advanced permission required

    Your current role can only read. Ask the system administrator to acquire write and comment permission.

    This team is disabled

    Sorry, this team is disabled. You can't edit this note.

    This note is locked

    Sorry, only owner can edit this note.

    Reach the limit

    Sorry, you've reached the max length this note can be.
    Please reduce the content or divide it to more notes, thank you!

    Import from Gist

    Import from Snippet

    or

    Export to Snippet

    Are you sure?

    Do you really want to delete this note?
    All users will lose their connection.

    Create a note from template

    Create a note from template

    Oops...
    This template has been removed or transferred.
    Upgrade
    All
    • All
    • Team
    No template.

    Create a template

    Upgrade

    Delete template

    Do you really want to delete this template?
    Turn this template into a regular note and keep its content, versions, and comments.

    This page need refresh

    You have an incompatible client version.
    Refresh to update.
    New version available!
    See releases notes here
    Refresh to enjoy new features.
    Your user state has changed.
    Refresh to load new user state.

    Sign in

    Forgot password

    or

    By clicking below, you agree to our terms of service.

    Sign in via Facebook Sign in via Twitter Sign in via GitHub Sign in via Dropbox Sign in with Wallet
    Wallet ( )
    Connect another wallet

    New to HackMD? Sign up

    Help

    • English
    • 中文
    • Français
    • Deutsch
    • 日本語
    • Español
    • Català
    • Ελληνικά
    • Português
    • italiano
    • Türkçe
    • Русский
    • Nederlands
    • hrvatski jezik
    • język polski
    • Українська
    • हिन्दी
    • svenska
    • Esperanto
    • dansk

    Documents

    Help & Tutorial

    How to use Book mode

    Slide Example

    API Docs

    Edit in VSCode

    Install browser extension

    Contacts

    Feedback

    Discord

    Send us email

    Resources

    Releases

    Pricing

    Blog

    Policy

    Terms

    Privacy

    Cheatsheet

    Syntax Example Reference
    # Header Header 基本排版
    - Unordered List
    • Unordered List
    1. Ordered List
    1. Ordered List
    - [ ] Todo List
    • Todo List
    > Blockquote
    Blockquote
    **Bold font** Bold font
    *Italics font* Italics font
    ~~Strikethrough~~ Strikethrough
    19^th^ 19th
    H~2~O H2O
    ++Inserted text++ Inserted text
    ==Marked text== Marked text
    [link text](https:// "title") Link
    ![image alt](https:// "title") Image
    `Code` Code 在筆記中貼入程式碼
    ```javascript
    var i = 0;
    ```
    var i = 0;
    :smile: :smile: Emoji list
    {%youtube youtube_id %} Externals
    $L^aT_eX$ LaTeX
    :::info
    This is a alert area.
    :::

    This is a alert area.

    Versions and GitHub Sync
    Get Full History Access

    • Edit version name
    • Delete

    revision author avatar     named on  

    More Less

    Note content is identical to the latest version.
    Compare
      Choose a version
      No search result
      Version not found
    Sign in to link this note to GitHub
    Learn more
    This note is not linked with GitHub
     

    Feedback

    Submission failed, please try again

    Thanks for your support.

    On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?

    Please give us some advice and help us improve HackMD.

     

    Thanks for your feedback

    Remove version name

    Do you want to remove this version name and description?

    Transfer ownership

    Transfer to
      Warning: is a public team. If you transfer note to this team, everyone on the web can find and read this note.

        Link with GitHub

        Please authorize HackMD on GitHub
        • Please sign in to GitHub and install the HackMD app on your GitHub repo.
        • HackMD links with GitHub through a GitHub App. You can choose which repo to install our App.
        Learn more  Sign in to GitHub

        Push the note to GitHub Push to GitHub Pull a file from GitHub

          Authorize again
         

        Choose which file to push to

        Select repo
        Refresh Authorize more repos
        Select branch
        Select file
        Select branch
        Choose version(s) to push
        • Save a new version and push
        • Choose from existing versions
        Include title and tags
        Available push count

        Pull from GitHub

         
        File from GitHub
        File from HackMD

        GitHub Link Settings

        File linked

        Linked by
        File path
        Last synced branch
        Available push count

        Danger Zone

        Unlink
        You will no longer receive notification when GitHub file changes after unlink.

        Syncing

        Push failed

        Push successfully