Jupyter Labへようこそ｡
前回は､ 基本中の基本のベースラインを作るために､ 商品の価格を予測するための愚かなモデルをいくつか見てみた｡
次は､ もっと興味深いベースライン・モデルを見てみよう｡
これはもちろん､ 一律の平均価格を予測する非常にシンプルなモデルを示した図である｡
小さな､ 小さな変更にお気づきかもしれませんが､ 黄色は見づらいと思うので､ ここにあった黄色をより見やすいオレンジ色に変更しました｡
しかし､ そうでなければ､ これはあなたにとって見慣れた写真になるはずだ｡
そして､ 平均して145ドルの差があることにお気づきだろう｡
この前の図を見たとき､ これを見せたかどうか定かではないが､ 平均して340ドルの差があったことを述べておく｡
だから､ 平均を取るよりランダムに当てる方が､ 明らかに成績が悪い｡
データセットが均等に分布していないからだ｡
それはええと､ ノルドは平均500だ｡
ああ､ わかった｡
それではここで､ 特徴工学の話題に移りたいと思います｡ 特徴工学は､ 伝統的な機械学習技術の中でも最も基本的なもののひとつです｡
率直に言って､ データ・サイエンスはかつてそうだった｡
これが私たちのやることだ｡
この種の問題が出てきたとき､ あなたはこの問題の側面は何か､
アマゾンの各商品のどのような側面が､ 価格を予測するのに最も適しているかを考え始めるだろう｡
そして多くの時間を､ フィーチャー・エンジニアリングと呼ばれる､ 特定の商品のどのような特性がその価格を予測するのに最も意味があるのかを解明することに費やした｡
ディープ・ニューラル・ネットワークがそのすべてを代行してくれるとわかるまでは､ 人々はその作業に多くの時間を費やしていた｡
もう1度言っておくと､ フィーチャー・エンジニアリングと伝統的な機械学習が素晴らしい結果を出すこともある｡
それがあなたの問題に必要なこともある｡
アマゾンの商品の場合､ そのような領域に入っていると思うかもしれない｡
あー､ でも､ どうなるか様子を見よう｡
そこでまず､ あることを思い出してほしい｡
トレーニング・データのひとつを見てみよう｡
detailsというフィールドがある｡
これはアマゾンのデータセットから吸い出したフィールドのひとつだ｡
これはPythonの辞書のようなものです｡
一見したところ｡
あなたはキーと値を見ている｡
ええと､ でも､ 実は全部が文字列であることにお気づきでしょうか｡
ええと､ すべて大きな糸なんだ｡
これは辞書を表すJSONブロブだ｡
トレーニングでもテストでも､ データセットのすべてのポイントでこの詳細フィールドを読み込んで､
テキストからPython辞書に変換できたらいいですね｡
そして幸運なことに､ 標準ライブラリーがその方法を教えてくれる｡
JSONパッケージを使えば､ Jsonができる｡ をロードまたはロードストリングすると､ これらの文字列をオブジェクトに変換する｡
だから､ それを実行して､ それを実行するんだ｡
数秒かかるだけだ｡
そして今､ 私ができることは､ トレイン・ゼロのドット機能だ｡
同じ文字列がPythonの辞書に変換される｡
見てみよう｡
それを実行しよう｡
これでよし｡
それはわかるだろう｡
申し訳ない｡
辞書を拡大すると､ そのテキストと同じであることがわかる｡
実際､ ドットキーを使えば､ そのキーがここにあることがわかる｡
今､ 私たちのデータには問題がある｡ それは､ これらの辞書が商品によって異なるデータが入力されていることだ｡
製品によっては､ ええと､ 機能がまったくないものもある｡
中には､ うーん､ ただ､ まばらな､ うーん､ 特徴のない人もいる｡
だから､ 人口に齟齬がある｡
それを感じ取ってみよう｡
Python標準ライブラリのもう一つの便利なツール､ collectionsパッケージのカウンターを使うことができる｡
カウンターを使えば､ いろいろなことを数え上げることができるし､
例えば､ "特徴数"､ "最も一般的なドット"､ "最も一般的な40個 "などと言うことができる｡
何が返ってくるか見てみよう｡
つまり､ ここに表示されているのは､ すべてのトレーニング・データ・ポイントに対して入力された､ 最も一般的な40の特徴です｡
それで､ 最初に空いた日付はたくさん埋まっているんだ｡
ほとんどね｡
ああ､ そうだね｡
人口40万人のうち36万人というデータセットがある｡
ええと､ アイテムの重量は非常によく人口に膾炙している｡
メーカーブランド｡
よく似たベストセラーだ｡
ランクも人口が多く､ その後は尻すぼみになる｡
では､ どのような機能を使うのが良いのだろうか？
まあ､ 私たちは本当に人口の多いものを探しているんだ｡
いいスタートだ｡
私たちは一貫して人口に膾炙していることを望み､ また､ 価格と有意義に関連しそうだと感じられるものであることを望む｡
それで､ これらのアイテムの重さを見ると､ かなり堅実な候補だと感じられる｡
つまり､ 明確ではないが､ おそらく重量と価格にはある程度の相関関係があると思う｡
もっと大きくて､ もっと重くて､ もっと平均的な価値があるような､
ブランドのような......｡
何かあるかもしれない｡
それはベストセラーになるようなことだ｡
だから､ まずはそこから始めよう｡
それらはそもそも妥当な機能だと感じる｡
そして､ もうひとつ､ 少し前に話したことに戻るが､ 追加しよう｡
ええと､ だから､ ちょっとジャンキーなことから始めようと思うんだ｡
ここに書いたように､ これはちょっと陳腐なものだ｡
この辞書に入力されているウェイトは､ とても汚いデータなんだ｡
ポンド単位の場合もあれば､ オンス単位の場合もあるし､ 100分の1ポンドやミリグラム､
キログラムなどさまざまだ｡
だから､ ここに大きな古いif文があって､ この重さがどの単位で計算されるかを調べ､
それをポンド数に変換して､ その金額を返しているんだ｡
だから､ これはそういうことなんだ｡
これで仕事ができると必ずしも納得させるつもりはない｡
私の言葉を信じることができるだろう｡
あるいは､ 私に不信感を抱いているのであれば､ この中に入って試してみてほしい｡
それから､ トレーニングに必要なウエイトも全部揃えるつもりだ｡
そして､ この行は､ もし明らかでなければ､ ここから「なし」をフィルタリングして､
もし私がその単位を認識していないものがあれば､ 「なし」を返すようにしています｡
平均重量は13ポンド｡ 6.
なぜ平均体重を計算する必要があるんだ？
少し技術的な理由ですが､ このような線形回帰を扱う場合､
学習セットの10％の項目のうち､ 重みを持たない項目をどのように扱うかを決定する必要があります｡
データサイエンティストの皆さんは､ 重みがあるかないかを表す特徴量を使うトリックがあることをご存知でしょう｡
そして､ それをどのようにモデルに組み入れるか､ 少し､ 小細工をしなければならない｡
もし重みがないのであれば､ 平均値を選んでそれを入れるというのも､
ひとつのアプローチとして立派なものだ｡
この関数はアイテムを受け取り､ その重量を取得しようとします｡ そして重量を返すか､
重量がゼロかゼロでないかを返します｡
重さがないものは､ 代わりに平均的な重さに置き換える｡
ええと､ これがデフォルトで体重を測るということですね｡
私たちがフィーチャー・エンジニアリングをしていく中で､ これはかなり､ ええと､ グロテスクな仕事だったと思う｡
だから､ ちょっと休憩して､ 私たちがやらなければならない他の機能について熟考してもらおうと思う｡
そしてまた戻ってきたら､ フィーチャー・エンジニアリングを終えてモデルを実行する前に､ ベストセラー・ランクに入るつもりだ｡
そして､ それがどのように価格を予測するかを見ている｡
すぐに会おう｡