より良いエンジニアを目指して

1日1つ。良くなる!上手くなる!

がやがやと作業をする会 〜 やることは先週と一緒!けど、たまにC#

weeyble-creative.connpass.com

 

初参加です。

主催のShionさんが気の利いた方で、机の上にお菓子を置いて準備していただいております。

再会とか辛いものとか 

で、やることは、先週のPythonもくもく会と一緒です。

で、その会で会った辛い物好きの方と再会。

彼には進展があったらしく、Windows + PythonからDocker + Pythonとなってました。

ちなみに、彼のお兄さんも辛いものに強いらしく。神田で繰り広げられる下記のイベントのスタンプラリーでゴールドを取ったそう。

kanda-curry.com

 ちょうど、今日開催しています。小雨ですが。

機械学習

ついに私も機械学習に挑戦。

あれ、この処理、いつまでたっても終わらないぞ。

Pythonの設定がおかしいのか? と思ったら。

f:id:rimever:20181104141002p:plain

4分近く処理をしていたようです。仕事してたのか。

本では3分だったのですが、勉強会用Macは貧弱なのでした。

 

本では、

  1. 基本的な計算を頑張って手で実装してもらってから、
  2. Kerasを使ってみて、Keras使うと速いでしょという流れになっています。

いざKerasを使おうぜとなったのですが、

「Using TensorFlow backend.」

Tensorflowも必要よと言われ、

じゃ、pip install tensorflowすっかとなると

 

  Found existing installation: numpy 1.10.1

Cannot uninstall 'numpy'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.

 

「なんなのヨー、これはー!」

 

NumPy - pythonでモジュールnumpyをインストールできない|teratail

上記リンクを参考にしました。 当然、対応法は無理やりインストールをチョイス。

レッツゴー!

92%の精度の手書き分析が以下。

f:id:rimever:20181104164308p:plain

7を9に間違えたのは、ありえないですが、一部は、人間でも間違えるか、わからないものも。

 

C#

一応Slackはあるのですが、

主催者のShionさんはハッシュタグでツイートされている様子。

#もくもくログ hashtag on Twitter

 

下記の記事を見られているようなので、一緒に勉強しながら、勝手に返信。

C# 7.0 の新機能 - C# ガイド | Microsoft Docs

ただ、作業するなら自宅でやればいいので、こういう交流も大事、のはず。

 

パターンマッチング

Resharperが勝手に修正するけど、いつの間にか追加された言語仕様でした。

会社は古い言語仕様のアプリが多いので、

rim「地味に書くか」

Reshaper「変更できます」

rim「じゃ、変えとけ」

Resharperの仕事にさせていたので、C#7.0からとか解釈してませんでした。

MSDN読まないとダメですね。

f:id:rimever:20181104143458p:plain

Not User Pattern Matchingというtypo

Shionさんによると、 Visual Studioでは指摘はしてくれても、修正まではしてくれないとのこと。

Resharperだからこそ、できる芸当らしい。 

ローカル変数

その関数でしか使わない処理をまとめてメソッドにしておきたいというケースはあるので。ラムダよりわかりやすくていい。

MSDNによると好みやスタイルで決めるが、ディティールには違いがあると。

ローカル関数とラムダ式の比較 | Microsoft Docs

 

戻り値にrefを返せる

自分も使ったことがなく。これは難しい話。

パフォーマンスを求めるところで、使えるらしいが、サッと出せるものなのか。

ufcpp.net

ufcpp.net

「前処理大全」を読んで自分の未熟さを知る

gihyo.jp

前処理大全は、いくつもの前処理において、SQL,R,Python においてAwesome な書き方とNot Awesome な書き方を紹介した本です。

Awesomeって「驚くばかり」という意味なんですね。

Pythonについて、まだまだこれからの私には目からウロコでした。

pandas配列インデックスではなく、queryで絞れとのこと。

私が書いていたのはど素人のコーディングでした。

Query使う前(Not Awesome)

high_age = data[data.Age == 47]
veteran_data = data[(data.Age > 33) & (data.Overall > 80)]

Query使ったら(Awesome

high_age = data.query('Age == 47')
veteran_data = data.query('Age > 33 & Overall > 80')

SQLのWhere句みたいにスマートに書けますね。 

終わりに

こんなのは序の口でまだまだいくらでもこの本ではたくさんのTipsが紹介されています。

Rとの比較も時間をかけてやってみたいです。

興味がある方は是非。

Jupyter Notebookでインテリセンスを表示して入力補完

テレビゲームばりにJupyter Notebookと機械学習にハマっている私なのですが、

インテリセンスないの辛いなーと思ってました。

ライブラリの関数名覚えないとならないじゃん、と。

Jupyter Notebookはインテリセンス出せる

調べると、出せるんですね。

forums.fast.ai

%config IPCompleter.greedy=True

  これを冒頭で宣言しておけば、tabを押せば出せます。

ただやや遅い印象で、ワンテンポ待たされます。

PyCharmでインテリセンス

これじゃ、下手な和訳にしかならんのでPyCharmでも試して見ました。   PyCharmはJetBrainsのIDEです。

JetBrainsのIDEは多くが30日試用版そののち有料なのですが、PyCharmについてはCommunity版に関しては無料で利用することが可能です。

www.jetbrains.com

Jupyter Notebookも普通に作れますね。

f:id:rimever:20181101203716p:plain

f:id:rimever:20181101192024p:plain

お、来ましたね。期待通り、早いです。何も押さずとも入力中に応じて、フォローしてくれるので高性能。

ただ、PyCharm自体の起動時に待たされます。Visual Studioもこの辺りが嫌がられるのか。

PyCharmの設定とか

自分のPyCharmの設定(Preference)をメモ。

f:id:rimever:20181101234412p:plain

Jupyter NotebookをPyCharm上で行うのは下記を参考にしました。

pleiades.io

私としては、jupyterをインストールする点がポイントでした。  

ゆるふわC#もくもく会 #61 〜 Alexa.NET

weeyble-csharp.connpass.com

実は、返却期限の迫ったPythonの面白い本をやっているので、Pythonをやって見たかったのですが。

さすがにもくもく会とはいえ、C#の会なんだからC#やらないと空気読めなさすぎだろということで。

今回はPCを持ってこない方もいたのでコミュニケーション多めで。

でも、もくもくしちゃいますね。

C#でAlexaを扱うという方がいらっしゃったので、それについて聞いてみました。

C#によるAlexaスキル実装の基礎 (1/3):特集:はじめてのAlexaスキル開発 - @IT

NuGet Gallery | Alexa.NET 1.5.4

  • 基本は、jsonを受け取って、jsonを渡す仕組み。
  • その気になれば、他の言語でもライブラリは作れるだろう。
  • C#のライブラリは非公式で有志で作られている。
  • 公式ライブラリはPythonとNode.js。

敢えて、C#で実装するというのがC#魂が感じられていいですね。

どこかの人は、C#機械学習しようとML.NET0.6にチャレンジして撃沈してましたが。

せっかくなので、ソースをクローンして、眺めてみると

GitHub - timheuer/alexa-skills-dotnet: An Amazon Alexa Skills SDK for .NET

using Newtonsoft.Json;

namespace Alexa.NET.Request
{
    public class User
    {
        [JsonProperty("userId")]
        public string UserId { get; set; }

        [JsonProperty("accessToken")]
        public string AccessToken { get; set; }

        [JsonProperty("permissions")]
        public Permissions Permissions { get; set; }
    }
}

めっちゃ、JsonProperty使って、json jsonしてる。

13日の金曜日。それは違うジェイソンか。

Alexaでドローンを動かすのが、この会の名物になりつつあります。

私は、Alexaもドローンもやってませんが。

自作キーボードをする人々がいる

わざわざ、そういうことをする人たちがいるのか、と。

奥深いなと。

自作キーボード沼 自由研究ノート - クックパッド開発者ブログ

AzureにBotを作るサービスがある

  Azure Bot Service - チャットボット | Microsoft Azure

最後に

その後、Pythonやりました。すいません。

FIFA18データセットで市場価値と総合力の相関にガウス曲線を適用してみる

Python機械学習の参考書を読んで勉強中なのですが、その中でガウス曲線なるものが出てきました。

直線より曲線であればデータに合っている場合に線形回帰より線形基底関数モデルが良いと。

以前、pandasでFIFA18のcsvデータについて分析してみましたが、

rimever.hatenablog.com

f:id:rimever:20181029231608p:plain

「むむっ、この散布図に適用できるのでは」と思い浮かびました。

勉強を中断して、試してみることにします。勉強より実践あるのみ。

f:id:rimever:20181030221513p:plain

これはなかなか。。。それっぽい。

ガウス曲線の値を調整するしていくことでより近づけることができます。

で、あまり大きくするとグニャグニャになって過学習となります。なるほど。これが過学習か、と。

最終的には訳のわからない形に。

f:id:rimever:20181031211109p:plain

まだまだ勉強中の身なので、わかっていない部分はありますが、面白いです。

Pythonを構築したら、brew updateがうまくいかなかったり

勉強会用の古いMacPythonを行なっていたのですが、自宅の作業用Macを動かすために構築しようと思ったら、Homebrewの更新がうまくいかず。

 

下記のQiitaの記事を試したのですが、

qiita.com

 

sudo chown -R $(whoami) /usr/local

Operation not permitted 

 

で、ダメでした。

 

blog.officekoma.co.jp

 

そしたら、Jupyter notebookのHomeディレクトリが「なんじゃこりゃあ!」みたいになっていたので、下記を参考に設定しました。

 

a-zumi.net

 

同じ人が同じ環境を構築したいのに、同じように構築できない。環境構築難しいですね。

 

 

 

 

 

pandasを使ってFIFA18のcsvデータで遊ぶ

はじめに

先日、Pythonもくもく会にて参加者の方と交流させていただいたのですが

rim「pandasって何ですか?」 参加者「そのうち出てくると思います」

とまあ、pandasすら知らなかったのですが

データ分析で頻出のPandas基本操作 - Qiita

データ解析のライブラリとのことですが、csvを扱うだけでも十分なくらいの機能を提供してくれます。

Jupyter Notebookの使い勝手の高さがわかったので、Jupyter Notebook上でpandasを使ってあれこれ遊んでみることに。

FIFA 18 Complete Player Dataset | Kaggle

軽くお手並み拝見 〜 47歳の選手

import pandas as pd

data = pd.read_csv('CompleteDataset.csv')

これだけで読み込めます。ここからが面白いところで

data.head()

データの一部を見れます。

f:id:rimever:20181029233605p:plain

data.describe()

f:id:rimever:20181029221040p:plain

各カラムについての平均や最大、最小などを表示してくれます。

注目はAge。何と、maxに47! 47歳のサッカー選手がいるようです。

FIFA18ではJリーグの選手まで世界全国の選手を登録しているとはいえ、47歳の選手とは一体。

high_age = data[data.Age == 47]
high_age.head()

47歳の選手をこんな感じに抽出できてしまうんです!

f:id:rimever:20181029221440p:plain

実にお手軽!

ちなみに47歳の選手は以下の選手でした。

Barry Richardson (English footballer) - Wikipedia

matplotlibというグラフ描画ライブラリを用いて、AgeとOverallの関係図を出してみます。

Overallは総合力を意味すると思うのですが、散布図にしてみると

f:id:rimever:20181029224308p:plain

サッカー選手のピークは30手前だと思っていたのですが、30をピークとする山なりの形状に。

35過ぎても能力の高い選手はいますね。

PandasのDataFrameで条件抽出する方法まとめ - DeepAge

veteran_data = data[(data.Age > 33) & (data.Overall > 80)]
veteran_data.head()

f:id:rimever:20181029225329p:plain

データの整形 お買い得な選手は誰だ

このデータセットValueと選手の市場価値が取得できるのですが、

temp_data = data['Value']
print(temp_data)
0        €95.5M
1         €105M
2         €123M

Mなどがついており、数値化をする必要があります。

python - Convert the string 2.90K to 2900 or 5.2M to 5200000 in pandas dataframe - Stack Overflow

temp_data = data.Value.replace(r'[€KM]', '', regex=True).astype(float) * data.Value.str.extract(r'[\d\.]+([KM]+)', expand=False).fillna(1).replace(['K','M'], [10**3, 10**6])
data.Value = temp_data

ここまでくると正規表現など、難しくなってきます。

変換したデータを元のValueカラムに返してあげます。

overall_data = data['Overall']
value_data = data['Value']

plt.scatter(overall_data,value_data)

総合力と市場価値を比較した結果。一番上にいるのはネイマールです。

80あたりをピークに市場価値のカーブが急に跳ね上がっていく様子。

それに対して、右下に位置する選手がいます。

これらの選手は能力は高いが、市場価値は低い。よって、お買い得な選手ということ。

f:id:rimever:20181029231608p:plain

bargain_data = data[(data.Value < 20000000) & (data.Overall > 84)]
bargain_data.head()

f:id:rimever:20181029232236p:plain

守護神ブッフォンが。さらにチェフと、やはりキーパーは長生きできるポジションということでしょうか。

ぺぺはアレですが、ゲーム的には文句なしでしょう。

最後に

csvをこんなに自在に操れるpandasには驚かされました。まだまだpandasには紹介しきれないほどに機能があります。

Pythonと共に青春を生きた若者からは、Excelでガチャガチャやっている姿は失笑されてしまうのでしょうか。

Jupyter Notebookは、WindowsでもMacでも使えるので、仕事でも趣味でも駆使していきたいですね。