(ニューラルネット使えばもっと点数上がったのに時間的にやめておいたのが悔やまれる。dataが10万強のサンプル数で、カラムはカテゴリカラムが116、数値カラムが14で目的変数であるlossが1つあるといった感じのデータセットです。手頃な感じでやりやすいもののようです。(普通はもっとデータ量が多くてラップトップPCではきついものが多いようです。Forumという意見交換の場を利用していくことでした。初心者からするとものすごい貴重な情報がたくさん載っています。戦略を立てる上でForumに載っている手法を真似して試していきました。Networkの手法(Kerasを用いたもの)でした。そこで、ひとまずXgboostingの手法を試してみることにしました。スクリプト最初に試したのは以下のスクリプトでした。https://www.kaggle.com/iglovikov/allstate-claims-severity/xgb-1114/codeこちらはxgboostのスクリプトでこれだけである程度の点数がとれます。xgboost自体も使うのがはじめてだったので参考になりました。(logを使ってるところ)パラメータが調整されている評価関数をMAEに変更している(今回の評価関数がMAE)といったところだと思います。したスクリプトでしたが参考になるところは多かったです。これが今回のベースになりました。次にパラメータを調整しようと思いました。用意されていたり、hyperoptなるものも人気らしいです。今回は使わなかったです。いうと時間がかかりすぎると思ったからです。先程のサンプルのコードを1回まわすのに100分強の時間がかかっていたので例えばグリッドサーチなどをやるにしてもある程度どれくらいの値がいいかの感覚もないのできついです。はやってみようと数個値を変えてやってみたところ、max_depthというパラメータをちょっと大きくすると精度があがりました。他は逆に下がるばかりでだめだめでした。max_depthは木を深くすれば精度が上がるのはまあ当たり前だなーって感じで、むしろ実行時間が長くなってしまって今思うと微妙でした。このあたり、精度と時間のトレードオフも学びです。あとから聞いたのですが、このスクリプトはパラメータはある程度調整は出来ていてこれ以上のパラメータ調整はそんなに意味をなさなかったらしいです。順番が前後したのですが、ここでデータがどうなってるかを考えました。今回のデータセットは欠損値がないというミラクルが起きていたようです。欠損値があれば、そのサンプルは消すが他のサンプルの平均で穴埋めするかとかしないといけなかったです。B->1、、)してあったのですが、XGBoostの場合はこれで問題ないようです。モデルによってはonehot-encodingとかしないといけないのでちょっと困惑ポイントでした。直感的には木で分岐していくのでonehot-encodingじゃなくてもよいようです。データ分析については以下の投稿が参考になりました。これ以上同一モデルで点数を上げるには特徴量をいじるしかないということで取り組むことにしました。(主成分分析)という次元削除の手法を試してみました。PCAはざっくりいうと出来るだけ情報量を失わないように特徴量を減らす手法です。今回は数値のデータが14つあるので、14->7に次元を削除してみました。それで予測を行うと点数が下がってしまいました。これは当たり前でそもそも情報量を落としているので基本的には点数は下がります。特徴を適当にいじれば点数上がるような感じでやってみてもダメですね。次元削除と特徴量を作ることは別ですね。次元を下げると計算量が少なくなるので今後効果的に使えるといいなと思います。相関それで次にloss(目的変数)と相関の高い特徴量を生み出すことに挑戦しました。今回のコンペのデータはカラムの名前に意味がなく全く手がかりがないので相関で考えることにしました。数値データのうちランダムに組み合わせて(足し合わせたり、logをとったり)相関が既存のカラムより高くなったものを新たな特徴量として追加しました。逆に点数が下がってしまい失敗でした。カテゴリデータの組み合わせForumで上がっているもので点数が上がっている特徴量作成のやり方として、カテゴリデータを使ったものがありました。任意の2つのカテゴリデータから1つの新たな特徴量を作成します。一方がAでもう片方がBならABというカラムが出来上がります。その後に、数字にするのですがA、B、...、Z、AA、AB、...、AZ、BB、のような順に数をつけます。A->0、B->1、AA->27のような数です。カテゴリデータは116個あるので全部使うと数が多すぎるので35個の特徴量を使いました。importanceの上位35個を使ったものと思われます。importanceは分岐の使われた回数を示すらしいです。xgboostのライブラリ中のメソッドから簡単に順位を出すことが出来ます。これは点数アップにつながりました。アンサンブル違うモデルを組み合わせると点数が上がるということでやってみようと思いました。Networkを使いたいところだったのですがまわす時間がなくて諦め、他のモデルも試さずにコンペが終わりそうだったので、とりあえず、XGBoostのいくつか試したものを加重平均してみました。これだけでも点数が上がったのでアンサンブルすごいなーと思いました。他の方の手法をきいてコンペが終わってから、同じコンペに挑戦していた研究室の先輩のお話を聞いてとても参考になったのでまとめます。(今回のコンペの上位4%以内の方)XGBoostのチューニング今回はForumのスクリプトがパラメータのチューニングを行っていたのでもともといい感じにチューニングしてありました。実際のところはどのようにやればいいのかききました。大体の感覚として以下のような感じらしいです。利用)randomサーチかマニュアルでパラメータを探すようです。Kaggleの上位者程、勘でパラメータを調整するらしいです。今回調整したのは上記のパラメータの範囲で適当に試して決めたとのことです。学習率はパラメータ調整のときは高めに設定して学習して100epochくらいまわして比較したみたいです。僕はパラメータ調整のときも時間をかけてしまっていたので参考になりました。NetworkのほうはForumに出てるスクリプトのunit数、epoch数を増やしたものを使ったとのこと。今回の目的変数のlossは歪度が正で、右に裾が広がる形をしていました。これにlogを取ると正規分布に近いかたちになります。このあたりの調整はForumでは先人がやってくれていたので、今回は大丈夫でKaggleでは基本的に誰かが見つけてくれるようなのですが、もしこれに気づかないと勝負にならないので注意が必要だということです。今回の評価関数のMAEは2回微分までを用意出来ない形なので近似した関数を目的関数におきました。これも適切に設定することが大事のようです。テーラー展開とかを使って近似させることもあるようです。このあたりは、Kaggleでは誰かが先にやってしまうので単純にこれによって点数差がつくことはほとんどないらしいのですが、上位を狙うためにはForumで共有される前段階で気づいて他の施策を行わないと時間的に勝てないみたいです。(XGBoost)特徴量の作成方法としては、上記のカテゴリの組み合わせと同様のことをやっていたみたいです。importanceの上位50個くらいをとってやったみたいです。2つの組み合わせだけではなく、3つ、4つまで行ったとのことです。それでどのカテゴリを組み合わせればよいかは以下のxgbfiというものを利用するとよいみたいです。github.comまた、数値カラムも適当な組み合わせで+-×÷の四則演算を試したようですが点数には寄与しなかったみたいです。カテゴリと数値のカラムも両方をカテゴリデータとして扱うか、療法を数値データとして扱うことで特徴量を作ることも出来るとのことでした。Networkをアンサンブルさせたとのことですが、もっと点数をあげるにはスタッキングというやり方を行うとよかったとのことです。1つとXGBoost3つでした。その3つは違う特徴量によって作られたものです。キングは複数の分類器でtrainデータを用いて予測を出し、その結果をまとめて新たな特徴量にし、それを新たなモデルにかける手法です。面倒ですが精度は出るみたいです。色々な分類器を試した(もしくは試したかった)ようです。今回のわからない部分を聞けたの一般論的な部分もちょっとわかった気がします。それと上位に食い込むにはどうすれば良いかのイメージが出来ました。次回以降のアプローチここはすごくざっくり。データの基本情報を見る。)欠損値がないかとか。Networkのアンサンブルをやってみる。この2つである程度の精度は基本的に出るらしい。epoch数少なめにパラメータ調整。importanceとかxgbfiとか。特徴量の意味がわかる場合はそこから考える。過去に終わったコンペですが、下記のコンペを復習も兼ねてやります。www.kaggle.comちなみに、今回僕がやったコンペも期間は終わりましたが、サブミットして点数も返ってくるので挑戦出来ます。Networkのスクリプトは3日かかったよ、とも聞いたので根気強く待つのも大切ですね。(今回僕は1日まわしても終わらなくて諦めました)あと、Forumに上位者がどういうことをやったかを共有してくれているので見ようと思います。Kaggleコンペが終わっても学びが多いです。終わりに細かいことの説明はしていませんが、大まかにやったことをログとして書きました。学びが多かったので次に活かしたいです。Forumなどを読んで理解を深めたいと思います。学習したことは共有したいと思っています。Boostingのframeworkを提供してくれるライブラリです。Boostingは決定木のような弱学習機をアンサンブルする形態のモデルを生み出します。高い精度が期待出来るためコンペでもよく登場するライブラリです。Leaningより気軽に使えるところも嬉しいです。1114今回はMacへのインストール方法をメモしておきます。Guideに書いてあります。install終わりにひとまずメモ程度にインストール方法を書いたので、今度もっと詳しいことを書くかもしれないです。EnvironmentTweet新しくMacBookを購入しました。初期設定を色々としないといけなかったので備忘録も兼ねて設定手順を書きます。いう設定は正解もないですし、あまり教わる機会もないので参考になればと思います。初心者エンジニアの方でこれを真似してご自身のスタイルを模索してはいかがでしょうか。先輩エンジニアの皆さんには是非おすすめ設定等ありましたら教えて頂きたいです。参考になる部分があれば幸いです。10.12.1USキーボードVimつかい大きく上記環境に依存することはないと思いますが、部分的に差異が出る可能性があります。「ホームディレクトリ」(家アイコン)「サイドバー」タブホームディレクトリ(家のアイコンとユーザー名)のチェックを入れる「ハードディスク」にチェックを入れる「詳細」タブ「すべてのファイル名拡張子を表示」にチェックを入れる隠しフォルダを表示ついてでにLibraryの表示も。https://raw.githubusercontent.com/Homebrew/install/master/install)"バージョンを確認出来たらインストール完了。$SHELL/bin/zshzshrcの設定.zshrc_kuboshizumaを.zshrcとしてホームディレクトリに置く。.zshrc_mac_kuboshizumaを.zshrc_macとしてホームディレクトリに置く。~/.zshrcとして設定を読み込む。アプリケーションのインストールhomebrew-bundleを用いて初期に必要なアプリケーションを一括でインストール。以下のコマンドでインストールが始まる。Homebrew/bundleホームディレクトリにBrewfileというファイル名で以下のファイルを作成する。bundlevimの設定vimrcの準備vimrc_kuboshizumaをvimrcとしてホームディレクトリに置く。e」とかしてファイルを変えるのはよくやるのでコメントしておきます。あと以下のようにすればes6シンタックスにも対応出来ます。s」で画面分割も出来るので便利だと思います。vimの設定に関しては慣れた人は自身の好きな設定があると思いますのでそれを適用させてください。これから使い始めるかたはここで紹介したものをベースにいらないものは捨て、よさそうなものを試して追加していくことをおすすめします。→「Preferences」から設定ウィンドウを開く。チェックを入れる僕はターミナルの代わりに「iTerm2」を使っています。gitの設定gitの諸設定.gitconfig_kuboshizumaを.gitconfigとしてホームディレクトリに置く。ファイル内の[user]と[core]のuser_name、user_emailはご自身のものを入れてください。以前書きました以下記事を参照ください。gitHubでssh接続する手順~公開鍵・秘密鍵の生成から~PHPの環境構築MAMPのインストールMAMPを利用。(「Macintosh」、「Apache」、「MySQL」、「PHP」の頭文字。)MAMPのサイトよりダウンロード。インストールまで完了したら「MAMP」を起動して「サーバを起動」をクリックする。(PCを再起動するときは再度「サーバを起動」することになります)MySQLは基本MAMPのMySQLを今後使っていく。.zshrc_macでaliasをはっているので以下のようにMySQLを使える。変更これでlocalhostにアクセスすれば/Applications/MAMP/htdocsのファイルにアクセス出来るようになる。--listでインストール出来るRubyのバージョンを表示させることが出来ます。-v2.3.1必要なバージョンを適宜追加する。RailsのインストールついでにRailsもインストールしておく。以前書きました以下記事を参照ください。(必要に応じて)ここまでで一通り出来ましたが、補足的なものを書きます。Bookmarkなどなど設定してみるとよいと思います。EditorとしてEvernoteDocument管理kobitoMarkdownでのメモ。終わりにこれだけの設定ができればとりあえず作業出来るのではないでしょうか。僕個人の環境構築ですが、皆さんのお役に立てれば幸いです。(エンジニア向け)Tweetもっと読むコメントを書く2016-10-03大学生がプログラミングをはじめる方法essayTweet最近更新がなかったので久々の投稿です。書いちゃうんですよね。こちらもちゃんと更新したいところです。今回はいつも書くような技術のお話とはちょっと違うことを書いてみたいと思います。テーマは「大学生がプログラミングをはじめる方法」です。プログラミングに興味があるけど、はじめの一歩が踏み出せない。そんな方に少しでも役立つと幸いです。ちなみに、ここでいうプログラミングとはWEB系のプログラミング、nativeアプリ、あとは機械学習等など、僕がやった範囲を想定しながら書いていることを予めお伝えしておきます。僕自身大学生になってからはじめてプログラミングを勉強し始めました。(書籍)最初に思いついつくのは独学です。僕は結構、本を使って勉強するのは好きです。初学者が本を取り出すと上手くいかない可能性は高いと思います。それは、自分に合う本がどれか分からないからです。身近に詳しい方がいて教えてもらえる環境であれば良いのですが独学の場合は難しいですよね。プログラミングに慣れてきたらいろんな本を手にとって見て下さい。(WEBサービス)最近?では様々なプログラミングを学ぶためのサービスがあります。基本的には無料のものも多いです。ここからはじめて感覚を掴むのは良いと思います。ドットインストールhttp://dotinstall.com/まずは、3分動画のドットインストールです。僕も一番最初にこの動画を見た覚えがあります。様々な言語がありますし、初心者でも分かりやすい説明で定番ともいえるサイトです。(基本無料)Progateprog-8.comブラウザ上で実際にコードを書いて学んでいくスタイルの学習サイトです。カリキュラムもどんどん増えてきて勢いがあります。ドットインストールより実践的なイメージです。こちらもおすすめです。(基本無料)Udemywww.udemy.comオンラインの動画学習サイトです。基本お金がかかりますが、カリキュラム立っていて学習しやすかったり、サポートがしっかりしているなどおすすめです。質問したら作者の方から翌日には回答されました。日本ではドットインストールやProgate程使われてない気がしますが(個人の感覚)、自分にあった講座に出会えると思います。Courserawww.coursera.org海外の有名大学の講師が提供してくれる授業です。英語ですが日本語字幕もあります。(全てではないかもしれませんが)理論的なところが多い気がするので一番最初は他のサービスのほうがいいかもしれません。他にも色々なものがありますが、有名で個人的におすすめな4つのサービスでした。公式のTutorial公式のTutorialは各種あります。Railsチュートリアル等、役立つものがたくさんあります。railstutorial.jpただし、一番最初はやめておいておいたほうがいいかなと思います。ひとつはプログラミング言語を知った上で新しく違う言語をはじめるときはいいかと思います。プログラミング教室TECH::CAMPtech-camp.in世の中には現在たくさんのプログラミング教室があります。従来の塾のような授業形式のものよりも実践型のものが勢いがあると思います。その中でおすすめはTECH::CAMPです。おすすめできるかというと、自分が通った&メンターをしていたから良さを知っているからです。他社のプラグラミング教室には通っていないので比較は出来ないですが、少なくともTECH::CAMPで失敗はないです。カリキュラムの質や質問のしやすさもいいですし、仲間が出来ることも大切です。お金はかかりますが、独学よりも手っ取り早く学ぶことが出来ると思います。僕自身は、勉強会の情報は今はSNSから入ってきたり、人からの紹介が多いですがはじめのうちは以下のようなサイトを頼るといいでしょう。dotseventdots.jp勉強会の紹介サイトです。dots自体も渋谷にコミュニティスペースがあり、勉強会が開催されています。学生部といったコミュニティもあるので興味があれば是非参加すると良いと思います。学生部に入ると1日いても500円で最高の環境でプログラミング出来ますよ。conpass、doorkeeperconnpass.comwww.doorkeeper.jpdotsと同じような勉強会のサイトです。僕は能動的にこの2つのサイトで勉強会は探すことは少ないですが、前はまあまあ見てた気がします。SALONtech-salon.com最近勢いがある学生向けの勉強会コミュニティです。イベントが月に20本以上やっているので気になるものがきっとあると思います。仲間も出来ると思うのでかなりおすすめです。僕も機械学習関係は行っています。インターン・アルバイトWantedlywww.wantedly.comおすすめ度が高いです。ここに載っているものは面白そうなものが多いです。今勢いがある会社も多いので、モダンな開発が出来る可能性も高いです。募集自体もどんな技術が使われているか等わかりやすいです。プロフィールを書いて、興味がある会社に話を聞きに行ってみてはいかがでしょうか?スカウトされることもあります。ニクリーチ29reach.com肉を食べたい。そんな軽い気持ちで登録しておくと会社から連絡が来るというなんともお得なサービスです。意外と?連絡がきてアルバイト等に結びついたのでおすすめです。サポーターズsupporterz.jp企業から支援金をもらって就活しよう的な就活風味のきいたサービスです。学部3年生とかであればここで会社の人と仲良くなってインターン・アルバイトしてみるといいかもしれません。goodfindwww.goodfind.jpこちらも就活風味が強いですが、インターンを探せます。前は使っていたこともありますが、最近はほとんど使っていません。知り合いから紹介されると良いですが、はじめはなかなか難しいかもしれません。ちなみに、僕がはじめてインターンに行った会社はセミナー終わりに直接スピーカーの方に話にいってそこでインターンが決まりました。積極的に社会人の方に話してこういうことがしたいっていうことを伝えるとスキルがなくても「うちでおしえてあげるよ」ってことになる可能性はあります。継続させるためにはさて、勉強をはじめても続けないと意味がありません。以下のようなことを意識的・積極的にやってみてはいかがでしょうか。勉強会に定期的に出る有名人をfollowQiitaやBlogに成果を書くコミュニティに入るサービスを作るインターン・アルバイトに行くプログラミングをはじめる目的は色々あると思います(作りたいサービスがある、他の人に差をつけるスキルが欲しい、就職に役立つ、一儲けしたい、なんとなく、etc...)。いずれにせよ、今回紹介したことを参考にしてはじめてみることがまず大切かと思います。(AND検索にも対応)RailsTweetサイトの記事数が増えてきてサイト内検索が欲しくなりました。いうわけで検索機能を実装するためのgemのransackで検索機能を実装することにしました。github.com今回やろうと思っているのは記事のタイトル検索が出来ればいいなーと思っています。あと検索のときに空白で区切ってAND検索になるようにしたいと思います。'ransack'それで、今回やりたいことを整理します。全ページのヘッダーに検索窓をつける。みたいな感じでqueryを渡す。検索ページに検索結果を表示する。全ページのヘッダーに検索窓をつける。好きなように検索窓を作ってしまいます。「q」でvalueをgetメソッドで渡すのでその部分は注意してください。%i.fa.fa-searchあと、classとかつけてstyle付ければいいですね。僕はfont-awesomeとか入れるの好きですが何でもいいですね。みたいな感じでqueryを渡す。それで、ひとつ注意があって単純にgetメソッドをつける以下みたいな余計なqueryがくっついてきてしまうことです。/search?q=hoge&utf8=✓&commit=submitというわけで解消します。以下のサイトを参考にします。www.mk-mode.comまず、commitなんちゃらのほうを取り除きます。オプションを渡すだけです。以下のファイルを作ればuft8なんちゃらが消えます。検索ページに検索結果を表示する。end以下で詳しく解説します。q.split(/[[:blank:]]+/)qは受け取ったqueryですが、空白で切り分けて配列にします。splitの引数に入れたやつで区切ってくれます。ようにすれば空白区切り出来るかと思ったのですが全角に対応出来ないみたいだったので探してみたらこんな感じでいけました。いうメソッドをgemの力をかりて実行します。いうオプションで値にqueryの配列を与えるとそれら全てを含む記事を引っ張ってくれます。title_cont_allの部分なのですが(検索するcolumn名)_cont_allの意味で、今回はtitleカラムを使いましたが適宜変更可能です。上記サンプルコードは、action_argsとかkaminariといったgemを使ったことがコードに反映されてます。はてなブログPro機械学習からWeb開発まで幅広く行っています。ビジネスチックなお話や日常のお役立ち情報まで雑多に有意義な情報を発信しようと思ってます。(2)ABOUTAI企業のエンジニアのブログです。機械学習、Web開発の技術的お話、ビジネスチックなお話、日常のお役立ち情報など雑多な内容でお送りします。seishin55AI企業エンジニア。プロフィールサイトはseishin55.com。LIFEおいおい書いていきます。スターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。