AWSの話題を中心に、日々の業務やプログラミングの徒然を綴るエンジニアブログです。

HANDS LAB

HANDS LAB ENGINEERS BLOG

ハンズラボエンジニアブログ

見よう見まねで機械学習をやってみた(ポケモン編)

Pocket

こんにちは!新卒の清水です。
最近、勉強または趣味でやっていたPyQの機械学習・初級をやり終えたので自分でもやってみました。

題材

以前Kaggleのチュートリアルはやったことはありますが、用意されているデータの説明がやはり英語だったのでそれなりにハードルがありました。
なので今回はネットを放浪中にポケモンのcsvデータがあったので、これを使用して行きたいと思います。

何をする?

個人的にみずタイプのポケモンが好みなのでステータスからみずタイプかどうか判定しようと思います。

環境

OS: macOS High Sierra 10.13.5
Python: 3.6.5
scikit-learn : 0.19.1
jupyter notebook

とりあえずデータをみてみる

pandasを使用してcsvデータを読み込みます。

ポケモンが909体(メガ進化も含む)なのでどうやら第七世代(サン・ムーン)までのデータのようです。

データの選別

ポケモンの各ステータス(HP, こうげき, ぼうぎょ, とくこう, とくぼう, すばやさ)を説明変数X、タイプを目的変数yとして学習させていこうと思います。
みずタイプであるのか、そうでないのかで判断したいのでみずタイプのポケモンには1をそうでないものには0を付与します。

関数を用意

applyメソッドを使用すると指定した列データ全てに関数を実行してくれます。
データをみてみましょう。

みずタイプが含まれている行を出してみました。みずタイプには1が振られています。

学習させる

もちろんscikit-learnを使用して学習させます。
今回は目的変数が2値なのでロジスティック回帰で行います。

トレーニングデータとテストデータの割合は7:3で分割します。

C = 1000としていますがこのCはハイパーパラメータと呼び、Cの値が大きすぎるほど過学習しやすくなり、小さすぎると学習にならない問題があります。
今回はCの値を0.01, 0.1, 1, 10, 100, 1000とパラメータを変えて影響があるか確認し、特に影響がなかったので1000のまま放置してます。

およそ87%の割合で判定することができました。
ほぼ自分一人の力で機械学習をしたのは初めてなのでまぁまぁいいのではないかと思います。

考察

判定に失敗した例としてオーダイルをみずタイプではないと判定しました。
そんなにポケモンを知らなくても、見れば多くの人はみずタイプだろうと判断するでしょう。

しかし、オーダイルの進化前のアリゲイツはみずタイプと判定しました

改善案としてはステータスの族ごとに学習をさせることで改善することはできると思います。
ですが、より高い精度を求めるならポケモンの画像データを使用するのがいいと思いました(全体的に青っぽいとか)。

最後に

ポケモンの知識がないと難しいところがあるのでやはりデータのリサーチは必要だということを感じました。
全体的な機械学習の流れは覚えられてきたのでこれから色々と試していきたいと思います。

Pocket

楽しく情報共有できるSlack活用術

Pocket

はじめまして。2018年4月新入社員(?)の原(@hxrxchang)と申します。

(”?” としてあるのには深い事情があります。。。詳しく知りたい方はオフィスに遊びにきてください。)

今回は、弊ラボ内で行われているSlack活用術について書きたいと思います。

Slack楽しく使っていますか??

Slackをただの連絡ツールとして使ってないでしょうか??

緊急連絡や進捗確認、議事録の共有くらいにしか使わない

なんてこともあるかもしれませんが、それだとちょっと息苦しいですよね。

就業中も終わった後もお休みの日までも、楽しくてついついSlackを開いちゃうような活用術をご紹介します。

分報を導入しよう!!

日報ならぬ分報です。

日報は1日に1回その日に行った作業や、次回の予定などを書くものですよね。

分報は1分に1回、その分で何をしたか、次の分に何をするか書くもの。。。

ではありませんのでご安心ください。

好きな時に好きなことを呟いていい、言うならば社内Twitterです!!

弊ラボでは、#times_◯◯(苗字のローマ字) という名前で各々チャンネルを作り、自由に呟いています。

呟く内容は

  • 読んだ記事の共有
  • 業務で嵌った点
  • ランチで食べたいもの
  • 休日の出来事

などなど、本当に自由です。

↑ラーメン二郎桜台店に感動した次の日に、node v10の console.table() に感動している私です。

分報導入のメリット

分報導入にはメリットがたくさんあります。というかメリットしかない??

私が感じたメリットを何点かご紹介します。

1. 技術のアンテナが広がる

弊ラボでは様々な技術が使われております。

例を挙げると開発言語では、

JavaScript、Python、PHP、Go、Shell Script、Swiftなど

またAWSの各種サービスを使用しているので、エンジニアの関心も多岐に渡ります。

そのため共有される情報も様々で、毎日知らないジャンルの情報に触れることができます。

私はJSしか触ったことがなかったのですが、入社してから

AWS LambdaでAlexaスキルを開発したり、機械学習のためにPythonをはじめてみたり、

Dockerで環境を構築してみたり、日々今まで知らなかった技術に触れることができています。

2. 気軽に質問できる

分報では情報を発信する他、質問することもできます。

gitの研修があったのですがその際に、

pull と fetch + merge どっちを使うべきなのかふと疑問に思い、以下のように呟いてみました。

研修にはメンターの先輩がついているのですが、こうして分報で呟くことで、会社全体の先輩方からアドバイスを受けることができます。

疑問があるけど誰に聞けばいいか分からない、いろんな人の意見を聞きたい時に気軽に呟くことができます。

ちなみに弊ラボでは、fetch + merge派が多数でした。

3. 自分から発信することで理解が深まる

私が記事や嵌った点を共有する時には、いいと思った点など何か一言添えるようにしています。

一言でもコメントを加えるには、記事の内容をしっかり読む必要があります。そうした心がけが少しでも理解に繋がるのではないかと思います。

自分が共有した内容にリアクションが多くついたり、コメントが来たりすると嬉しくなり、

もっと共有したい!!

ってなることでインプットの量が増える、という好循環になると楽しいです。

まとめ

以上、分報を使ってSlackで楽しく情報共有しよう! という記事でした。

デメリットを強いて挙げるなら、

Slackが気になって見すぎてしまうということでしょうか。

そうなったら ⌘ + q で閉じてあげましょう。そして落ち着いたらまた開いてあげましょう。

そんなデメリットを凌駕するくらい分報はいいものです。

ぜひ導入してみてはいかがでしょうか!?

 

 

 

 

Pocket

ブラウザのLocalStorageにデータ保持させてみた

Pocket

初めましてこんにちは、今年度新卒入社しました大作です。

大学時代では、Hot Soup Processorというスクリプト言語で簡単なゲーム開発しかしておらず、本格的なプログラマとしてデビューしてからまだ間もないヒナ鳥です。今は技術レベルや理解がまだ低いですが、これから日々勉強していきたいと思います!(ぴよぴよ)

 

今回やること

今、新人研修ではHTML, CSS, JavaScript(jQuery)を用いてアプリ制作をしているのですが、

  • ブラウザのリフレッシュしても入力したデータを保持する
  • 保存するデータの中身は複数項目がある(日付とか件名とか)

 

以上の機能要件を満たすものを作っており(この時点で作っているものが大体想像つくであろう)、他の同期がサーバを用いた方法で紹介していますが、こちらでは入力したデータをブラウザのLocalStorageに保存する方法で実践します。

 

そもそもLocalStorageって何なんだ?

私自身の復習がてら調べました。

クライアント側のローカル環境にデータを保存するWebStorageの仕組みの一つで、もう一つにSessionStorageがある。それぞれの特徴は以下の通り。

  • LocalStorage‥‥永続的に保存される
  • SessionStorage‥‥ブラウザを閉じるまで保存される

 

LocalStorageが主に使用されているのがショッピングサイトの商品履歴だそうな。

 

 

やってみた実践コード

保存データは、配列の中にプロパティがそれぞれ入ったオブジェクトが入るようにします。ここでは、追加日付、名前、ラジオ(期限or予定)を入れてます

HTML

JavaScript

取得処理で、データの中身が空だった場合にparseしたものを直接配列に入れると、配列の中身を読めないエラーを吐いてしまうため、if文で制御して入れないようにしました。(この問題に同期から助言を頂きました。感謝!)

まとめ

学び始めは理解に苦しみましたが、やっていくうちになんとかLocalStorageを用いたデータ保存が出来るようになりました! 感想としては、LocalStorageへの保存は簡単ですが、オブジェクトデータから中身を取得するのがとても大変でした。

次はAjaxでも出来るようにしてみようかと思います・・・・

 

Pocket

1day outingを利用した話

Pocket

皆さまこんにちは。

弊社では1day outingという制度があり、週に1度自宅やコワーキングスペースで勤務することができます。

今回は特別にGWの2日間を1day outingし、社外での作業方法を検討してみました。

続きを読む 1day outingを利用した話

Pocket

BitZeny 〜わいCPUマイニング始めるんだってよ〜

Pocket

BitZeny 〜わいCPUマイニング始めるんだってよ〜

こんにちは、こんばんは。おはようございます。 2018年新卒社員の地福(じふく)です。 学生時代にちょっとした楽しみでマイニングしていたBitZenyについてお話しさせていただければと思います。

BitZenyってなに?

最近話題にも上がらなくなってきた暗号通貨です。
有名どころのBitCoinはGPUマイニング主でした。(近頃はASICというものが流行っているそうです。)
しかしBitZenyはCPUでのマイニング(GPUも可能になりました)に適しているため、古いマシンでも比較的簡単にマイニングができるようになっています。
知っている中では、タブレットやスマホでもできるとか・・・

以下BitZeny情報です。

  • シンボル : ZNY
  • アルゴリズム : Yescrypt
  • 最大発行枚数 : 2億5000万
  • プレマイン : 0(事前発行数)
  • ブロック生成時間 : 90秒
  • 難易度アルゴリズム : DarkGravityWave3(1ブロックごとにDifficultyを変更するアルゴリズム)
  • マイニング報酬:250(2017年12月現在62.5枚)
  • 半減周期 : 50万ブロックごと
  • 国産コイン!!!

 


ハッシュアルゴリズム、Yescryptを選んだ理由

Yescryptにした理由は、Scryptの後継になりそうなパスワードハッシュアルゴリズムだったためです。

良いパスワードハッシュアルゴリズムとは

パスワードのハッシュ化は必須ですが、どのようなハッシュアルゴリズムでも良いかというと、そうではありません。
例えば、SHA256でハッシュ化したパスワードを全探索する場合を考えます。
パスワードが仮に8文字かつ64文字種だった時、パスワードの種類は約281兆5000億個です。
これに対し、最新のASICは1秒間に1兆回、SHA256を計算することができます。
つまり、SHA256のパスワードハッシュが流出した場合、282秒あれば元のパスワードが分かってしまいます。
これではダメなので、標準化されているPBKDF2ではハッシュを2000回繰り返すことが推奨されています。繰り返しを大きくすれば、より安全になりますが、パスワード認証のためのサーバー負荷が増えることになります。
結局、普通のハッシュアルゴリズムでは、サーバー(CPU)の計算効率がASICの計算効率よりもひどく劣っていることが問題です。CPUとASICで同じような効率のハッシュアルゴリズムが良いアルゴリズムと言えます。そこで出てきたのがbcryptとscryptですが、scryptはASIC化されてしまいCPUよりずっと効率が良いのはご存知だと思います。
というわけで、より良いパスワードハッシュアルゴリズムを決めるためのコンペが開催されていて、 それがPassword Hashing Competitionになります。
現在、Password Hashing Competitionには22個のハッシュアルゴリズムがエントリーしていて、その中から良い物を選定中です。Yescryptはその中でもかなり優秀だと私は考えています。

出典 : BitZenyの総合案内所 解説より

 


マイニング方法

windowsの環境だとすぐにできるのですが、Macだとそうはいかないので今回は、 Ubuntuで行なっていきます。 続きを読む BitZeny 〜わいCPUマイニング始めるんだってよ〜

Pocket