Leveraging HTML in Free Text Web Named Entity Recognition 論文まとめ

URL

メタ情報

  • 8 December 2020
  • COLING2020のポスター発表
  • 著者
    • Colin Ashby and David Weir
      • TAG Lab, Department of Informatics, University of Sussex, Brighton, UK

概要

  • HTMLタグを含むフリーテキストにおける固有表現抽出(NER)の性能について調査
  • 5つの英語データセットを使用し、BERTとLSTM+CRFモデルで評価を行い、HTMLタグの含有がNERの性能向上に寄与することを示した。
  • また、HTMLタグを含めた文ベースのNERが効率的に行えることも示した。

詳細

導入

  • Webページの情報(HTML)は読みやすくするために書かれており、抽出しやすいわけではない
  • そのため、HTMLタグはNERにおいて破棄されることが多いが、NERの性能を向上させるために有用な可能性があるかどうかを調査

貢献

  • フリーテキストにHTMLタグを含めると、NERの性能にどの程度影響するのか?
  • この効果の原因は何か、またどのウェブページが最も恩恵を受けるか。
  • HTMLタグは文ベースのNERに効率よく含めることができるか?

テキスト処理

下記3つのテキストを使う

  1. free text
  2. Set1: <p>タグのみを含む
  3. Set2: <p>, <h…>タグを含む

前処理

  • HTML要素は内部のみを取得し、commentとscriptは削除
  • table, list, option要素は無視
  • nltkにて一つのsentenceにまとめ、text + tag化
  • sentenceの例 <h3> <a> Australia </a> and the world </h3>
  • text onlyの場合は、上記からtextのみを取り出す

データセット

データセット

  • Types:
    • Entityの数(labelの数)
  • Categories:

    • サイトの種類
  • OrgPersons

    • Persons + 組織
  • Persons
    • ウェブサイトから人物属性を抽出するタスクのために、Distant Supervision (Mintz et al., 2009) をテストDBpedia (Bizer et al., 2009)から全人物を抽出し、各人物名から上位10位までのWeb検索結果をページコーパスとして利用する
    • annotationsは著者が行い、一致率は98.5%
  • RE3D
    • 防衛・安全保障情報分析官の役割に関連するエンティティ
  • SWDE, WEIR
    • Webページからの情報抽出のためのデータ

モデル

  • Bi-LSTM+CNN+CRF
    • GloVe
    • W2V(100 dimension, 20 iter, window size=5)
  • BERT
    • bert-base-cased
    • fine-tuneした(具体的には書かれていない)

結果

結果

  • 1, 2はそれぞれset1, set2

考察

  • 文章
    • Table1のTag Densityと性能向上が相関している(Pearson correlation: 0.72)
    • Tag Densityの分布を分析すると、いくつかのタグを含む自然言語文と、例えば<h1> John Smith </h1>のような繰り返しタグの密なパターンの2種類の文が明らかになった。(?)
    • また、WEIR.2では、Text+Tagsの方が、文の種類が混在するバリエーションで若干性能が良く、パターンが支配的であることがわかった。(?)
  • Entityの区切り
    • LSTMの結果を分析し、成功・失敗したEntity labelを区切るタグの出現比率を調べた
    • まず、HTMLタグで区切られるEntityは16%~31%
    • Closing Tagで区切られる場合は、Opening Tagで区切られる場合よりも、122~251%成功率が高い
    • 良い成績のtag
      • opening tag
        • </em>, <h・・・>, <em>, <strong>, <a>, <br/>, <span>, <div>
      • closing tag
        • <br/>, <em>, <span>, </h・・・>, </span>, <img>, </a>, </p>, </div>
    • 悪い成績のtag
      • opening tag
        • <i>, <p>, <br>
      • closing tag
        • <br>, </strong>
    • Interesting point
      • <br>, <br/>が種類により性能が変わる
      • イタリック体(<i>)だと性能が悪化
      • 性能の悪いタグに対する前処理が今後は必要
  • model
    • BERTは文のタグ密度に依存せず、安定してText+Tagsにて性能が向上している
    • LSTM W2V Text+Tagsは BERTを4/10回上回る
    • Personにおいては、W2VよりもGloveの方が性能が良かった

結論

  • NERにおいて、HTMLタグがText+Tags文とText-Only文を比較
  • Text+Tagsでは、0.9%から13.2%のF1向上
  • 前処理に必要な時間は3%から11%増加
  • データセットは多様なため、今回の手法の柔軟性と適応性は高い

文章がどのぐらい具体的か測定したい

※ こちらは「Sansan Advent Calendar 2022」の21日目の記事です。昨日はkur0ckyさんによるマラソンではじめる効果的なKPTでした。彼が如何にマラソンと飲酒を愛しているかが伝わる熱い記事でしたね。

概要

  • 文章の具体度を定量的に測定できると、自身の文章のレビューに使える。
  • 最も簡単に試すため、単語の具体度データセットを利用し、単語ベースでの文章の具体度を測定した。
  • 単語の語彙を増やすために、単語分散表現を特徴量としてSVRで具体度を推論し、再度文章の具体度を測定した。
  • 単語の具体度推論については一定上手くいっていそうだが、文章のスコアリングは上手くいかない。ユースケースと具体的であることの定義を詰めたほうが良さそう。

初めに

説明をする際、「具体」と「抽象」を繰り返すと説得力を増すと一般的に考えられています。

例えば、「最近は家で取り組むことが出来る趣味が人気だ」というと抽象的ですが、さらに「例えばNintendo Switchは売上が好調だし、Netflixもサービスが人気で業績を伸ばしている」と加えると具体的な文章となり、説得力が増します。

この「具体」と「抽象」を自分も良い感じに使いたい、となった時、「普段の自分の説明はどの程度、抽象的 or 具体的なんだろう?」という疑問を持つでしょう。

その疑問に一定のヒントを与える方法として、文章の具体度の定量化が考えられます。 例えば、チャットツールの中で自分の説明に対して、具体度を可視化することができたら、自分の説明バランスを考え直すツールとなり得ます。

このようなサービスがあったら良いなと思いました

今回は、そのアイディアを最も簡単に行う方法として、日本語文章の具体度を単語のみで測定することを試してみます。

repo

利用したrepoはこちらです。

github.com

具体的とは?

文章が具体的である、と考えられる要素は複数あります。軽く書いてみましょう。

  • 名詞が特定のものを指している
  • 「例えば」などが使われている、指示語が少ない
  • 話を聞いて、そのイメージが想像でき、それが複数人の中でほぼ同等のイメージとなる

定義が難しいですが、今回は「名詞が特定のものを指している」に着目します。

方法

流れを下記に書きます。

  • 単語がどの程度具体的かをスコアリングする
    • スコアリングされたデータベースを用意する
    • DeepLにて英語を日本語に変換する
  • 単語を元に、文章単位でスコアリングを行う。
    • スコアリングを行う文章を用意する
    • 単語ベースでのスコアリングを行う
  • スコアリングされた単語を増やす
    • スコアリングを行う文章の名詞を抽出する
    • 単語ごとのベクトルを、日本語 Wikipedia エンティティベクトルから取得する
    • スコアリングを行う文章の名詞に対し、SVRを用いて具体度を推定
  • 再度、文章ごとのスコアリングを単語ベースで実施

それぞれ見ていきます。

単語がどの程度具体的かをスコアリングする

単語の具体性をスコアリングするための手法を説明していきます。

スコアリングされたデータベースを用意する

こちらはMedical Research Council Psycholinguistic Database(MRCDB)というデータベースの情報を利用します。

UWA Psychology: MRC Psycholinguistic Database (Dict Interface)

MRCDBには150837語が収録されており、それぞれに最大26の言語学的・心理言語学的属性が付与されています。 その中には、具象性スコア(Concreteness rating)、心像性スコア(Imagability rating)が両方紐づく単語が3011語存在します。

スコアの具体的な説明は、下記論文の記載が非常に分かりやすいため引用します。

Webページの具体度の評価と具体的なWebページのためのクエリ推薦

具象性とは視覚や聴覚などの感覚によって経験することができる度合いを示す属性であり,心像性とは心的イメージの思い浮かべやすさの度合いを示す属性である.

具象性スコアと心像性スコアには高い相関があることが同論文内で説明されており、更に単語の具体度を下記のように定義しています。

具体度の計算(論文より引用)

今回はこちらの具体度を利用します。具象性スコアと心像性スコアが100~700の値を取るため、具体度についても100~700の範囲をとる値となります。

DeepL APIにて英語を日本語に変換する

今回は、日本語の具体性を測定したいと考えています。しかしMRCDBは英語のデータベースです。そこで、DeepLのAPIを用いて日本語に変換します。「英語でスコアリングされたデータを日本語で変換してそのスコアは有用なものなのか?」という疑問は当然ありますが、今回は気にせず進めようと思います。

MRCDBは全て大文字で単語が登録されていますが、DeepLの変換時は小文字の方が変換性能が上がるため、全て小文字に変換したのちにDeepL APIによる変換を行っています。(例: MILK → milk → ミルク)

変換された単語帳をTranslated MRCDBと呼びます。 更にTranslated MRCDBについて、具象性スコア(CNC)、心像性スコア(IMG)から具体度を計算します。

具体度が上位の5単語を下記に貼ります。

具体度が上位の5単語

比較のために、具体度が下位の5単語を貼ります。

具体度が下位の5単語

確かに具体度が上位の単語の方が、視覚や聴覚で経験していたり、具体的な事物が想像しやすい経験がありそうに見えます。

単語を元に、文章単位でスコアリングを行う。

スコアリングを行う文章を用意する

今回は、名大会話コーパスの「data001.txt」を用います。

https://mmsrv.ninjal.ac.jp/nucc/nucc.html

名大会話コーパスは129会話, 合計約100時間の日本語母語話者同士の雑談を文字化したコーパスです。 「data001.txt」はファミリーレストランにおける雑談を記録したものであり、先頭部分は下記のようなものとなります。

@データ1(約35分)
@収集年月日:2001年10月16日
@場所:ファミリーレストラン
@参加者F107:女性30代後半、愛知県幡豆郡出身、愛知県幡豆郡在住
@参加者F023:女性40代後半、岐阜県出身、愛知県幡豆郡在住
@参加者M023:男性20代前半、愛知県西尾市出身、西尾市在住
@参加者F128:女性20代前半、愛知県西尾市出身、西尾市在住
@参加者の関係:英会話教室の友人
F107:***の町というのはちいちゃくって、城壁がこう町全体をぐるっと回ってて、それが城壁の上を歩いても1時間ぐらいですよね。
F023:1時間かからないぐらいだね。
4、50分で。
F107:そうそう。
ほいでさあ、ずっと歩いていたんだけど、そうすと上から、なんか町の中が見れるじゃん。
あるよね。
ほいでさあ、なんか途中でワンちゃんに会ったんだね。
(ふーん)散歩をしてるワンちゃんに会ったんだ。

これらの文章中に、Translated MRCDBに含まれる単語から、文章ごとの具象性スコア、心像性スコアを計算します。計算方法は下記です。

  1. 文章中に含まれる単語のうち、Translated MRCDBに含まれる単語を抽出する。単語が複数存在する場合は全て抽出する。
  2. Translated MRCDBのスコアリングを、文章のスコアとして用いる。単語が複数ある場合はその平均をスコアとする。

例えば、「ミルクを飲み、ステーキを食べた」と言う文章があった場合、ミルクとステーキの具体度はそれぞれ654.0, 646.5のため、文章の具象性スコアは(654.0 + 646.5) / 2 = 650.25とします。

また、MRCDBにはasのような接続詞も含みますが、今回は単語のみを考慮に入れ、文脈などは考慮に入れないため、利用する品詞も名詞に限定します。 その際分かち書きが必要になるため、今回はvibratoを利用しました。

tech.legalforce.co.jp

単語ベースでのスコアリングを行う

スコアリングを行った後の文章は下記のようになります。

スコアリング後の文章

columnの意味はそれぞれ下記です。

  • org_text: 元々の文章
  • use_word:org_textのうち、Translated MRCDBに含まれていたword
  • CNC: use_wordの具体度を平均したもの

まずは具体度が高い文章5件を見てみましょう。

具体度が高い文章5件

比較のため、具体度が低い文章5件も確認します。

具体度が低い文章5件

use_wordが少ないため、高い文章と低い文章であまり差が出ていないように見えます。

そのため、具体度が付与されている単語を増やす方針を取りたいと思います。

スコアリングされた単語を増やす

スコアリングされた単語を増やすために、簡単に推論を行います。

方法として、単語ごとのベクトルを特徴量として用い、Translated MRCDBを正解データとして学習したモデルを用いて推論します。

スコアリングを行う文章の名詞を抽出する

今回の推論対象のデータに含まれる名詞を抽出します。 個数としては481個になりました。先頭10個を抜き出すと下記のようになります。

推論対象のデータに含まれる名詞10個

単語ごとのベクトルを、日本語 Wikipedia エンティティベクトルから取得する

次に単語ごとのベクトルを日本語 Wikipedia エンティティベクトルから取得します。この際、ベクトルが付与されない単語については除外しました。

日本語 Wikipedia エンティティベクトル

スコアリングを行う文章の名詞に対し、SVRを用いて具体度を推定

SVRはscikit-learnのライブラリを利用します。

scikit-learn.org

パラメータは特にいじらず初期値です。また、日本語 Wikipedia エンティティベクトルに対し標準化を行っています。

推論結果

具体度が高いと推論された単語5件は下記のようになりました。

具体度が高いと推論された単語5件

比較のため、具体度が低いと推論された単語5件も確認します。

具体度が低いと推論された単語5件

サンドブリキ行動十分を比較すると、確かに具体的な単語がスコア高く推論されていそうです。意外とできるものですね。

再度、文章ごとのスコアリングを単語ベースで実施

「単語ベースでのスコアリングを行う」と同様の方法でスコアリングを行いました。

まず、スコアリングが行われた文章が増えたことを確認します。

推論前は269 / 827 = 33%、推論後は612 / 827 = 74%の文章がスコアリングされており、推論可能な文章が増えたことが分かります。

次に、スコアリングに使う単語の数の平均が増えていることを確認します。 推論を行う前は平均1.40単語使われていました。推論を含めた場合は平均2.91単語が含まれており、一定単語数は増えていそうです。

具体度が高い文章10件を見てみましょう。

具体度が高い文章10件

具体度が低い文章10件も確認します。

具体度が低い文章10件

・・・推論なしの場合とあまり違いを感じませんね🤔

もうちょっと比較するために、出力結果を一覧にまとめました。 なんとなくですが、推論後の方が、具体度が低い文章に対する納得感が増すと思います。

出力結果一覧

改善するなら

まず、文章が具体的とはどういうことかを明確にする必要があるなと思いました。

次に、想定しているユースケースを具体的にし、より適切なコーパスが必要だと感じました。

また、文章に含まれる単語の平均をとる方法の改善も必要だと考えます。含まれる単語が多ければ多いほどスコアリングも平均に向かっていくためです。

終わりに

以上です。明日はAmane KamiyaさんによるBrand Strategyグループについてです。どんなグループなのでしょうか。わくわくですね。

「採用基準」を読みました

採用基準という本を読みました。面白い内容だったため、ここに簡単に記録を残しておきます。

内容を簡単に

  • 日本全体として、リーダーシップが重要とする意識が足りていない
  • 日本人は、グローバル人材の定義として、地頭の良さ、英語力の高さを上げる、しかし、外国ではここに必ずリーダーシップ経験が入る
  • リーダーシップ経験とは、自分でどうすればより良くなるかを考え、それを実行することである
    • 例えば、会議終わりの会議室でお菓子が残っている際に、「このお菓子、誰か持ち帰りませんか?」と聞ける人
    • 例えば、タクシーに行列が出来ている際に、「同じ方向の人は一緒に乗っていきましょう」と言える人
  • リーダーシップを発揮し、最初に新しいことを始める人は、必ず負担がある、また必ず一定数の人からは反対の声がある、それを受け止め、自身の考えを貫ける人

感想

  • 自分で何かを改善したい、と思うことが少ないかも?
  • ゆえに、リーダーシップを発揮して何かを改善した経験が少ない
  • 願望として、会社の重要プロダクトに、自分が考えたアルゴリズムが利用されていることを目指している

明日からやること

  • 常に自分の考え、ポジションをはっきりさせて意見を言う
    • 他の人の意見を聞いてそちらの方が良さそうと思えたら儲け物
    • 分からないことは分からないと言う

40%キーボードを作った際の備忘録

40%キーボードを作った際の記録を残していきます。

家にはんだ付け用製品が何もない状態でのスタートだったため、購入商品が今から始める人にとって参考になるかもしれません。

完成品

Corne Cherry V3です

製作時間

合計10時間ぐらい

購入方法

秋葉原にある自作キーボード専門店、遊舎工房さんにいき、店員さんにどのようなものが欲しいか相談しながら買いました。店舗にいた合計時間は2時間ぐらい。

shop.yushakobo.jp

私の場合の条件は下記

  • 分割キーボードであること
    • 体が大きいので、分割じゃないと背中が痛くなります。
  • ホームポジションから全てのキーが届くようにしたい
    • 不器用なので、遠くのキーのミスタッチとても多いのです

参考にしたサイト

Corne Cherry V3のBuild Guide

github.com

Corne Cherry V3の基盤を購入するとQRコードが付いており、そこから本サイトを見ることができます。 作成する順番はサイトに従いましょう。

私の場合、定期的に説明を読んでも分からない箇所や、どのパーツのことを指しているのか分からない、パーツを取り付ける正しい向きが分からないなどの問題と直面しました。 そのため、以降のサイトも参考にしています。

遊舎工房さんQ&Aサイト 組み立てについてのよくある質問

yushakobo.zendesk.com

とても丁寧に書かれています。最初は全ての記事に目を通してもいいと思います。

Crkbd v3.0 Keyboard Build log

www.youtube.com

工作を実際に行っている動画です。どうはんだ付けするのか、どのような順番でパーツをつけていくのかが非常に参考になります。 あとかっこいいです。

購入物

はんだ付けのための品物を何も持っていない状態です。 完全未経験者も、下記を買っておけばなんとかなると思います。

全部で3 ~ 4万円程度

40%キーボード関連

Corne Cherry V3

Corne Cherry V3 – 遊舎工房ショップ

遊舎工房さんで購入

スイッチ

Kailh BOX Silent スイッチ – 遊舎工房ショップ

必要なのは42個とのことでしたが、工作の途中でミスをするかもしれないので予備の3個を含め45個購入しました。 実際に1個壊れてしまったため、予備を買っておいて良かったです。

遊舎工房さんで購入

キーキャップ

ENJOYPBT ABS DOUBLESHOT KEYCAPS SET – 遊舎工房ショップ

40%キーボードにするならキーの配置に関してはソフトウェアで変えるようになるため、無刻印でも良かったかもなぁと思っています。

遊舎工房さんで購入

TRRSケーブル

Corne Cherry V3同士を接続するケーブルです。

遊舎工房さんで購入

USB-MicroUSB接続ケーブル

買ってみてから気づきましたが、Androidスマホなどを充電するためのケーブルで代替できました。

遊舎工房さんで購入

やすり

基盤をプレートから外した箇所のザリザリした部分をヤスリで平にしました。

近所の100均で購入

ハンダ付け関連

はんだごて(ピンセット入り)

amzn.asia

360℃でつけると綺麗にはんだが乗りました。(私はLEDをつけていないため、LEDに対しての温度はもっと低いと思います。)

コテ先は下記のものを使うとはんだ付けがスムーズに行きました。

使うコテ先

ピンセット入りなので、別途ピンセットを買う必要はありません

一緒に入っているハンダは使わない方がいいです。 私は基盤にうまく乗りませんでした

Amazonで購入

はんだ

amzn.asia

これを使うようにしたら、急にハンダが乗るようになりました。

Amazonで購入

作業マット

amzn.asia

あると、ネジなどがどこかに吹き飛んでいかないため便利です Amazonで購入

注意点

  • 下記の手順は全てのハンダ付けで共通です。

    • はんだごてを電源に繋ぎ、360℃に設定して、10分程度待つ
    • コテ先で3秒間基盤を温める
    • ハンダを、基盤とコテの間に当てる
    • ハンダが溶けたことを確認する
    • ハンダを離す
    • コテを離す
  • Corne Cherry V3のBuild Guideにも乗っていますが、予備ハンダをしましょう。

  • ProMicroはコンスルーを使いましょう!遊舎工房さん推奨です。(Link)。自分はスプリングピンヘッダをハンダ付けした後に気づきました。

  • はんだをランドに乗せやすくするフラックスは、自分は必要ありませんでした。

使ってみての感想

1日目

2日目

3日目

  • キーマップが自分で変えられるのはとても便利だなと思います。

  • ホームポジションから手を動かさないくていいのは便利だと思います。

  • キーキャップがなぜかやたら外れます

  • Layerの概念に全く慣れない、PCのロック画面を解除するのも一苦労しています。

リッジ回帰のパラメータの大きさの計算と、λを変化させたときの結果の変化

この記事は何?

リッジ回帰は、正則化項としてパラメータの大きさの項を足したものです。 ただ自分の場合は、「パラメータの大きさって具体的に何?🤔」とか、「パラメータが変化すると、回帰直線にどんな影響を与えるの?🤔」とか気になったので、簡単な実験をしました。

今回の内容は、「機械学習のエッセンス 第05章 03 リッジ回帰」を非常に参考にしています。

機械学習のエッセンス -実装しながら学ぶPython,数学,アルゴリズム- (Machine Learning) | 加藤 公一 |本 | 通販 | Amazon

3行で

  • 2次元において、リッジ回帰のパラメータの計算を行った。
  •  λを変化させた時に、リッジ回帰のフィッティングがどう変化するかをグラフで示した。
  •  λが大きくなると、リッジ回帰の傾きが小さくなる。

前提

リッジ回帰は下記の関数 E を最小化するような w を決定します。


\displaystyle
E(w) = ||y - Xw||^2 + λ||w||^2 \tag{1}
  •  y : 入力データ
  •  X : 出力データ
  •  w : パラメータ
  •  λ :  w の大きさをどのぐらい重視するかのハイパーパラメータ

線形回帰に対し、第二項目が加わり、 E がパラメータ w の大きさを考慮するようになっています。

パラメータ w の大きさって具体的に何?🤔

簡単のため、今回は2次元に絞った話をします。

(1)式の y - Xwを見ると、 w  Xの係数となっており、どうやら回帰直線の傾きのようだと分かります。

また、 λ  w を重視する具合を決めるハイパーパラメータのようです。

理解を深めるため、例えば、 λ =1のとき、入力点 (x, y) = (1, 2), (2, 4)に対し、どのような計算を行うのか確認しましょう。

まずは (x, y) = (1, 2), (2, 4)をグラフ上にプロットします。

plot

次に、sklearn.linear_model.Ridgeでfittingを行います。理解のためにbias項は省いています。そのため、必ず原点を通るという条件でのfittingになります。

ridge

リッジ回帰の結果は上図のようになりました。

この時、どのような計算を裏で行なっているのか考えてみましょう。

(1)式に (x, y) = (1, 2), (2, 4)を当てはめると下記式のような計算になります。

 
||
\begin{pmatrix}
2\\
4
\end{pmatrix}
-
\begin{pmatrix}
1\\
2
\end{pmatrix}
w
||^2
+
1.0||w||^2
\tag{2} 

この式が最も小さな値を取る際の、 wを計算することになります。

手計算でも解けるので、実際に解いてみます。

 
||
\begin{pmatrix}
2\\
4
\end{pmatrix}
-
\begin{pmatrix}
1\\
2
\end{pmatrix}
w
||^2
+
1.0||w||^2
 
=
||
\begin{pmatrix}
2-w\\
4-2w
\end{pmatrix}
||^2
+
1.0||w||^2
 
=(2 -w)^2 + (4-2w)^2 + w^2
 
= 6(w - \frac{5}{3})^2 + \frac{10}{3}

よって、 w = 5/3 ≒ 1.66のとき、最小値10/3を取りそうです。

 w は、回帰直線の傾きだと最初に説明しました。 計算が合っているのか確認するため、今回の例における回帰直線の傾きに該当する、sklearnのridgeの係数を確認してみます。

import numpy as np
from sklearn.linear_model import Ridge

x = np.array([1, 2])
y = np.array([2, 4])

xx = x.reshape(-1, 1)
yy = y.reshape(-1, 1)

model = Ridge(alpha=1, fit_intercept=False)
model.fit(xx, yy)
print(model.coef_)

sklearnのridgeでは、(1)式の λ が引数alphaで実装されています。 また、bias項を0にするため、fit_intercept=Falseを行なっています。

出力は下記になります。

 [[1.66666667]]

よって、手計算の w の値と、sklearnのridgeの係数が一致することが確認できました。

では、次からは λ を変化させ、パラメータの大きさを考慮する具合を変化させた時に、リッジ回帰の結果がどう変わるかを見てみましょう。

 λが変化すると、回帰直線にどんな影響を与えるの?🤔

 λ の変化に伴い、回帰直線がどう変わるかを見ていくため、徐々にデータ点が増える状況を想定します。

具体的には下記のような増え方を想定しています。

データ点

赤い点が外れ値の想定です。

各図に対し、 λ を変えるとリッジ回帰の結果がどう変化するかを見てみましょう。

実装はこんな感じです。

import matplotlib.pyplot as plt
import numpy as np
from sklearn.linear_model import Ridge

x = np.arange(12)
y = 1 + 2 * x
y[2] = 20
y[4] = 0

xmin = min(x)
xmax = max(x) + 1
ymin = -1
ymax = max(y) + 1
fig, axes = plt.subplots(nrows=3, ncols=5, figsize=(10, 8))

def plot_fig(axes: np.ndarray, xx: np.ndarray, yy: np.ndarray, row: int, col: int, alpha: int):
    axes[row, col].set_xlim([xmin, xmax])
    axes[row, col].set_ylim([ymin, ymax])
    axes[row, col].scatter(xx, yy, color="k")
    model = Ridge(alpha)
    model.fit(xx, yy)
    predict = model.predict(xx)
    xs = [xmin, xmax]
    ys = [predict[0], predict[-1]]
    axes[row, idx].plot(xs, ys, color="k")

for idx in range(5):
    xx = x[: 2 + idx * 2].reshape(-1, 1)
    yy = y[: 2 + idx * 2].reshape(-1, 1)

    plot_fig(axes=axes, xx=xx, yy=yy, row=0, col=idx, alpha=0)
    plot_fig(axes=axes, xx=xx, yy=yy, row=1, col=idx, alpha=10)
    plot_fig(axes=axes, xx=xx, yy=yy, row=2, col=idx, alpha=100)

fig.tight_layout()
plt.show()

結果の図はこちらです。

λを変化させた場合のリッジ回帰の結果の変化

1行目は λが0のとき、つまり線形回帰と同じ条件での結果になります。 それに対し、2行目、3行目では、 λを10, 100と変化させています。

1行目では、外れ値が加わると傾きを大きく変化しているように見えるのに対し、2行目、3行目では傾きの変化が小さくなっていることが分かります。ただ、今回のリッジ回帰の結果においては、傾きの変化が小さいことが良いわけではありません。データによって良い場合と悪い場合がありそうですね。

終わりに

リッジ回帰の気になる点を調べました。おかしい点があれば教えて下さい。

AtCoder Beginner Contest 261 A - Intersectionの考え方


表題の問題について、自分の理解のために簡単にまとめます。

問題

atcoder.jp

目的

AtCoder Beginner Contest 261 A - Intersectionについて、解説のページは下記です。

atcoder.jp

読むと、答えは  max(0,min(R_1,R_2)−max(L_1,L_2)) で求めることができると知りました。なぜこの回答でいいのかを、公式の説明動画を元に簡単にまとめます。

www.youtube.com

考え方

今回の問題は、赤の線と青の線のどちらも含むXが何個あるか求める問題を言い換えることができます。

式にすると下記のようになります。

 \displaystyle
L_1 ≦ X ≦ R_1
 \displaystyle
L_2 ≦ X ≦ R_2

まずは、2つの式の左辺について考えます。

この時、 L_1 L_2のうち、大きい値を選択し、その値よりもXが大きければ、Xの条件は満たされます。

よって、 max(L_1,L_2) ≦ Xが成り立ちます。・・・①

次に、 2つの式の右辺について考えます。

この時、 R_1 R_2のうち、小さい値を選択し、その値よりもXが小さければ、Xの条件は満たされます。

よって、 X ≦ min(R_1, R_2) が成り立ちます。・・・②

①、②より、下記式が成り立ちます。


 \displaystyle
max(L_1,L_2) ≦ X ≦ min(R_1, R_2)


よって、今回の問題の答えは min(R_1, R_2)−max(L_1,L_2) で求まりそうです。

しかし、上記だと、線が被っていない場合を考慮できていません。 下記図のように、左から、1,3,5,7が与えられた場合を考えてみましょう。

すると、 max(L_1,L_2) =  5,  min(R_1, R_2) =  3となり、 min(R_1, R_2)−max(L_1,L_2) =  3 - 5 =  -2となります。しかし、今回の問題では、被っていない場合は0を出力することが期待されます。

計算結果がマイナスの場合、0に出力するためにmaxを利用します。すると、最終的な答えは max(0,min(R_1,R_2)−max(L_1,L_2))となります。

実装

一応Pythonでの実装を載せます。この短さで解けて感動です。

if __name__ == "__main__":
    l1, r1, l2, r2 = map(int, input().split())
    print(max(0, min(r1, r2) - max(l1, l2)))

与那国島へ行ってきました


初めに

7/16(土) ~ 7/18(月・祝)に与那国島へ旅行しに行ってきましたので、その思い出を簡単にまとめます。

なぜいった

日本の東西南北の端のどこかに行きたいという友人がいたためです。今回は西へ。

感想

仲の良い友人との旅行という意味でとても楽しめる場所でした。また、海底遺跡があるため、ダイバーの旅行客も多くいました。

思い出

飛行機は下記のような日程でした。

飛行機での様子

今回は原付での旅を予定していましたが、3人中2人が免許はあるが原付に乗ったことがなかったため、原付を借りることができませんでした。 その後、ご好意で宿泊先の方の車をレンタルさせて頂くことになりました。本当に感謝しています。

到着したその日に、まずは日本の最西端に行きました。

島は車で30分程度で一周できます。

島の途中には与那国馬や、果実?のような物が実っていました。 与那国馬は2018年時点で130頭であり、与那国町の天然記念物に指定されています。Wikipediaより引用

その次は、Dr.コトー診療所のロケ地になった場所に行きました。 実際に昔診療所として機能していたと言われても違和感がないほど馴染んでいましたが、撮影用に作られた場所らしいです。

初日の夜は、海響(いすん)という名前の居酒屋でご飯を食べました。いろいろあって昼食を食べられていなかったのもあり、最高に美味しかったです。

tabelog.com

その後、与那国町が一望できる場所で2時間程度、星を見たり雑談したりしていました。 明かりが少ないのもあり、都内よりも星がとても綺麗に見えました。ただ、写真では上手く撮れなかったのが残念です。

二日目は島内を散策していました。 まずはビーチ巡り。泳ぐ気はなかったので散歩だけしていました。

その後は、海底遺跡を見ることができるクルージングに参加しました。

海底遺跡は、与那国の海底に存在しています。その外見はまるで人工物の遺跡のように綺麗な直線を描く部分が多かったです。

もし遺跡である場合、動植物の分布や鍾乳石から作成された時期は1万年前以上前と推定されているようです。ただ、学術的調査では、自然地形として考える説の方が強いようですね、Wikipediaより引用

何にせよ、ロマン溢れる場所でした。なお、三半規管が貧弱な私は途中から酔いとの闘いをしていました。(ただ、友人達全員酔っていたため、かなり酔いやすいものだと思います。)

その日の夜は、「日本最後の夕日が見える丘」に行きました。

夕日が沈む1時間前ぐらいから待機していたのですが、だんだんと人が集まっていき最終的には5〜6人程度人がいました。

最終日は帰るだけですが、空港で朝からマグロ漬け丼を頂きました。

最後に

というわけで終わりです。あまりしっかり計画しない旅行が好きなので、一緒に行ってくれる友人がいるのはありがたいなと思いました。