【Season 3, Episode 25】Regression with a Mohs Hardness Dataset【データコンペ06】

コンペ概要

For this Episode of the Series, your task is to use regression to predict the Mohs hardness of a mineral, given its properties. Good luck!

コンペ詳細

目標

Hardness:鉱物のモース硬度、数値が大きいほど硬い。

モース硬度主に鉱物に対する硬さの尺度の1つ。硬さの尺度として、1から10までの整数値を考え、それぞれに対応する標準鉱物を設定する。

データ

課題種別:回帰
学習データサンプル数: 10407
説明変数の数:12
欠損値:0

Column Dtype Explanation
id int64 ID
allelectrons_Total float64 総電子の合計
density_Total float64 密度の合計
allelectrons_Average float64 総電子数の平均値
val_e_Average float64 電子値の平均値
atomicweight_Average float64 原子量の平均値
ionenergy_Average float64 イオンエネルギーの平均値
el_neg_chi_Average float64 不明
R_vdw_element_Average float64 原子のvan der Waals半径の平均値
R_cov_element_Average float64 原子のvan der Waals半径の平均値
zaratio_Average float64 za(?)の比率
density_Average float64 密度の平均
Hardness float64 硬度
評価指標

Median Absolute Error (MedAE):中央絶対偏差
中央値からのバラツキ具合を表す統計量。

情報公開ポリシー

Data Access and Use.
Competition Use and Commercial: You may access and use the Competition Data for any purpose, whether commercial or non-commercial, including for participating in the Competition and on Kaggle.com forums, and for academic research and education. The Competition Sponsor reserves the right to disqualify any participant who uses the Competition Data other than as permitted by the Competition Website and these Rules.

データのアクセスと使用。
コンテストでの使用および商用: お客様は、コンテストや Kaggle.com フォーラムへの参加、学術研究や教育など、商用か非商用かを問わず、あらゆる目的でコンテスト データにアクセスして使用することができます。コンテスト主催者は、コンテスト Web サイトおよび本規則で許可されている以外のコンテスト データを使用する参加者を失格にする権利を留保します。

学習の目的

選択理由

前回は慣れるためのKaggleコンペだったので次の段階に進むために同一レベルのコンペに挑戦。

目標・目的

  • 上位30%
  • 前回に引き続きデータの確認

分析

ベースライン作成

データの簡易的な確認をしながらベースラインの作成をしていきます。
欠損値はなし。すべての説明変数が数値となっています。

ヒストグラムを確認すると正規分布にしたがっていない、8あたり以降は極端に少ないことがわかります。 残差が正規分布に従っていれば目的変数をいじる必要はないので後ほど確認していきましょう。

また今回の評価指標はMedAEということで中央値である5.5より大きく離れた値はざっくりでいいので、そこまで気にする必要がないのかもしれません。

allelectrons_Total,density_Totalの2つの変数を使ってベースラインを組み立てていきます。変数の意味がよくわからないという理由が大きいので適当に選びました。

LightGBMを使ってとりあえず進めていきますが、評価指標にMAEを使います。ない場合は作る、いいスコアが出る評価指標を探すなどになってくるんでしょうかね。

#tr: 0.7836963619945065 val: 0.8932997796228672
"""
                            mean           std
col                                           
density_Total       21455.341226   5793.254134
allelectrons_Total  18952.061917  11361.887126
"""

残差をバリデーションごとに確認。正規分布に近しい形と判断。ので変形はせずに進めても問題なさそうです。

データの確認

変数を調べても詳細が出てきませんでした。なので分布などを簡単に確認していきます。実務の場合では匿名の情報を使う場合もあると思うのでここらへんの対処を今後理解していきたいですね。

全体的に大きく寄っているというのが見て取れます。

allelectrons_Average,atomicweight_Average相関係数が高く1.0となっています。そのほかにも相関係数が0.7以上のものがちらほらあるので注意が必要です。 一方で目的変数のHardnessに対する相関係数はそこまで高いものはありません。

特徴量生成

今回力を入れようとは思っていましたが中々にうまくいきませんでした。理由としては変数について理解ができなかったからです。ここについては振り返りの時に他の人がどういう変数を作っているのかを確認していきたいところ。
とりあえず変数同士の掛けた値を用意して進めていきます。

モデル選択

グラフを見てわかる通り、ある程度大きい区切りを持つと多値分類とも捉えられそうだとディスカッションのページにありました。そこでlightgbmでの回帰、分類の2つで進めていきました。

結果的にはこの二つのアンサンブルでスコアが改善したので良かったと思います。

振り返り

説明変数

今回の変数はもとからよくわからない、かつ少ないので手の施しようがわからずでした。他のcodeを見てみて以下を見つけました。

  • 加減乗除全部やってる→明確なことがわからないから全部やってるんだな。
  • 数値属性を割り切ってカテゴリにする→カテゴリにして目的変数の平均、分散、歪度をとる
  • 原子量から全体の重さとかを求める→難しかった。
  • 変数変換

やはりほかの人も変数を作るのは苦労していました。なのでそこを変換したりして工夫していました。

モデル

ベースライン作成段階でいろいろなモデルを試している人が大半でした。
私の場合lightgbmしかやっていないので、初期パラメータであってもベースライン作成時に試してみたいと思いました。次回以降の課題ですね。1つずつ増やしていきたいところ。kerasが扱いやすいと聞くのでそこら辺から広げていきたいです。

その他

重みづけ

中央値絶対誤差という特殊な評価指標だったこともあり、端のほうは大雑把にあっていれば指標には影響はしないというコンペでした。そのため中央値に近い値に重みをつけたりすることでスコアの改善を図っていたりしていました。

train,testの分布

trainとtestの説明変数の分布を確認していました。今回は似たような分布でしたが、まったく違っていたらバリデーションの作り方などを工夫しないといけないのでこのタイミングで確認できてよかったです。

反省点

引き出しがすくない

今回少し長い期間を1つのコンペに絞ってやってみましたが、引き出しが少ないのですぐガス欠になりました。
今の段階ではまだ数を重ねてできることを増やしていくべきだと判断しました。たとえ粗削りでも。次からはいくつかを並行してもいいのかなと。

Codeを読んでいなかった。

後から気づいたのですが、コンペ期間中でも有用なコードがCodeに投稿されていました。Discussionばかり読んでいて全く読んでおらず。ここを参考にして学びながらより良いスコアを取れたらモチベももう少し高く保てていたのかなと。後半はスコアが伸びず、引き出しもなくモチベが下がり気味でした。

JuptyerNoteBookのメモリオーバー

メモリオーバーしたことでnotebookが開けなくなるという事故が起きました。程よいところでデータフレームを出して次のnotebookに移りましょう。痛い目にあいました。

最後に

新しいことに挑戦しよう。モデルとかすこしずつ択を増やしていきたい。kaggleのnotebookに投稿してまとめるとどういうコードを書いたか確認しやすいのでそういう利用の仕方はいいかもしれない。検討。