2021年12月27日
【読み物】機械学習/データサイエンティストへの道のり Y.T体験談

2021年4月入社の Y.T です。今回で2回目の投稿となります。(前回:「Python機械学習で人物判定をやってみた」)今回は読み物です。

当社に入社し、早8か月くらい経ちました。
その後私はデータサイエンティストとして、大手企業へ機械学習の自動化ツールを使ったデータ分析のお仕事をさせて頂いてます。
毎日、AutoML(Automated Machine Learning)ツール、グラフ、計算式と睨めっこしております。(大変だけど遣り甲斐はあります。)
最近寒くなりましたね。ほぼ在宅ワークなので毎日毛布被ってハムスターみたいになりながら仕事してます。。。誰だっけ関東あったかいって言ったの。北海道と変わらないんだけど!
残業がほぼほぼ無い現場なので楽です。と言うか他現場のメンバーも基本無いのか。在宅ワークなのでいつも音楽聞きながら、歌いながら仕事してます。

話し逸れましたが、最近機械学習だとかデータサイエンティストだとかその辺りの単語をよく耳にしますね。
時代背景を考えると日本はまだまだ取り入れ始めたばかりで、徐々に認知度が上がってきていて需要が増えてる最中、なのは当然なんですが、
たぶん現在進行形で目標にされている方も大勢いらっしゃるかと思います。将来性があり今後の需要にも期待できる分野ですからね。

ネット情報を調べると、「すごく難しい」、「有名大学卒の肩書、学力が必要」だとか色々書かれていますね。
この場では詳細は割愛しますが、結論: 「全然そんな事ないみたいです。」
いや、あった方が良いのは間違いないんですが、就くだけならどうやら「必須」では無いみたいです。
厳密に言えば、研究方面と実務方面とかでも別れるので一概には言えないのですが。
実際僕何も無かったですし。。。たぶん僕ほどわかりやすい事例は無いでしょうね。

ちなみに現在の案件に参画するまでは「線形ロジスティック回帰」や「LightGBM」なんてワードを聞いた事すら無かったです。
そもそも「機械学習」なんて言葉を知って触り始めたのが2021年5月くらいでしたか。それまでは何も知りませんでした。
なので色んな経験含め、「やる気」、「探求心」さえあればいくらでも何とでもなる様です。
(現場の関係者皆様本当にありがとうございます。)
SEとしての経験値的な物ももちろんそうですし、ましてやデータサイエンティストなんて当時は本当になれるとは全く思ってなかったです。
それこそ当時はネット情報で判断してました。とりあえず目指してみるけど相当きつそうだな、と。
先述の通り、どうやら頑張ってたらけっこう何とかなるみたいですね。

参考までに「何を勉強したか」を書いておきます。
・Python 3 エンジニア認定基礎試験
・Python 3 エンジニア認定データ分析試験
・OSS-DB Silver
・統計検定 3級
・サイト名:Kaggleの、タイタニックの問題
等です。全て見よう見まねでまさしくがむしゃらにやってました。
触る前なんか本当にわけがわかりませんでしたが、人間やってる内に何となくでもわかってくる生き物の様です。

今はまだこれ関係をやってる人が僕だけなので、個人的な願いとしては機械学習の仲間が欲しいですね。
という事で、AI/機械学習に興味のある、或いはデータサイエンティストに興味がある方、個人的に是非ともお待ちしております!
いずれそういう部を。。。なんて。

もちろん言語大好きな方、全くの初心者の方も!
大真面目に当社は実務経験無し、そもそも触った事が無い状態からのスタートの方も多数います。
熱意と、サポートさえあれば本当に何とでもなるみたいです。僕もだいぶ助けて頂きましたが。
その都度のスキルレベルにもよりますが、未経験の方であれば簡単なお仕事から始められ徐々にレベルアップ出来ます。

そんなわけで、SEを目指している方、経験者の方も是非お待ちしております!

以上です。ありがとうございました!



2021年9月9日

ナンプレ(数独)の問題生成ツールをVBAで作成!

初めまして、新入社員のR.Sです。
前職はサービス業で、ITとは無縁の世界にいました。
PCに特に詳しいということもなく、「プログラミング」という言葉はどこか遠い世界の言葉のような気がしていました。
そんな知識ゼロ・経験ゼロの私がたった1か月の研修で、以下のような作品を作ることができました!!!

今回はExcelVBAを使用し、ナンプレ(数独)の問題生成ツールを作成しました。

ご存じの方も多いかとは思いますが、簡単にナンプレのルールを説明すると、
「縦・横・9×9のボックス内に同じ数字が被らないように数字を入れていく」というものです。
今回は、3段階から難易度が選択でき、難易度によって空白マスの数が変わる仕組みです。
(本来、問題の難易度を上げる要素は空白マスの数のみではないのですが、今回はそれ以外の要素は度外視して作成しました。)

問題生成の流れは以下のような流れです。
1.左上のボックスから順に81マス全てにランダムに数字を入れていく

2.そこから選択された難易度に応じてランダムで各ボックスから数字を消し、空白マスを作る

細かい仕組みを説明するともう少しあるのですが、ここでは割愛します。
全てのマスを埋めた後、[Answer]ボタンで解答のチェックをすることもできます。
ナンプレは複数通りの解答が存在する可能性があり、それらも許容できる仕様にしました。

簡単な内容ではありますが、ロジックを考えてそれを形にしていくことの楽しさを知り、今後も勉強して複雑なものも作成したいと考えています。

それではまた。



2021年8月12日

Python機械学習で人物判定をやってみた

初めまして、新入社員の Y.T です。
最近、「AI / 機械学習」を重点的に勉強していまして、
「AI / 機械学習を使った画像の人物判定」を作ってみたので、これについてのお話をさせて頂きたいと思います。

GitHub → https://github.com/nazuna2371/public.git
「person_judgment_ver1.0.ipynb」を開いてご確認ください。

以下は上記「person_judgment_ver1.0.ipynb」の中身に関しての簡単な説明です。

今回使用した画像は以下7枚です。(当社ホームページ内で使用されている画像です。)
尚、全体的に画像の内容が読み取り辛いかもしれません。ご容赦ください。

 

これらの画像の中で、この方

が「いるかいないかをプログラムに判定させよう」というものが趣旨です。
実際のソースコード等については「person_judgment_ver1.0.ipynb」をご確認ください。

早速ですが、中身の話に入ります。
まず手法のお話ですが、数値では無く画像の取り扱いなので、所謂「教師あり学習の分類」になります。
そして学習アルゴリズムですが、種類自体はいくつもありますが
今回使用したのは「グリッドサーチ」、「ランダムフォレスト」、「サポートベクタマシン」、「K近傍法」です。
(最後の方で何となくついでに教師なし学習のクラスタリング(KMeans)もやってみました。案の定の結果でしたが。。。)
使用したパッケージ等については、jupyter notebook、numpy、matplotlib、pandas、scikit-learn、SciPy、OpenCV、Pillowです。

次にプログラムの流れをざっくりと説明します。
今回は「7枚の画像」を使用しています。分類を行うにはとても心細い数ですので、
「NumPy Data Augmentation」によって7枚 * 12枚 = 84枚に増やしています。
まず1枚の元の画像を、素の画像とグレースケール化させたものの2種類にしました。
そしてその2枚それぞれを上下左右に反転させたり、角度を変えたりして増やし、精度向上に繋げようとしています。

↓ 84枚の画像(見切れがあります。) ↓

そして増やしたこれらの画像データを「学習用データ」等として使用しますが、
そのまま各ピクセル毎の数値を「特徴量」として使用すると
ちょっと違う画像になると「同じ人物」でも「全く別の人物」として認識されてしまうので、
多少映っている位置や姿勢、表情等が変わっても正確に人物判定が出来る様に
一旦「ヒストグラム」として変換し、それを「特徴量」として使用しています。
要するにヒストグラム化する事によって、「その人の特徴、パターン」を数値の配列にしています。

↓ ヒストグラム グラフ表示(見切れがあります。) ↓

次に、実際に学習 → 予測をさせて行きます。
84枚分の画像をヒストグラム化させた配列と、「教師データ」である.csvファイルを渡し、
「学習用データ」と「テストデータ」に分けています。
(厳密にはこの場合は変数は4つです。そして今見たらtrain_test_split関数の比率の引数を忘れてましたね。。。)

↓ 学習、予測部分のソース ↓

↓ 教師データ.csv ↓

今回は「ランダムフォレスト」と「グリッドサーチ」で回しています。
まずは「学習用データ」を読み込ませて学習させ、
次に「テストデータ」の分を読み込ませ、「この人物は誰か?」を判断させたものが「予測結果」です。0、1です。
ランダムフォレストとグリッドサーチとは~。。。
長くなるので割愛します。気になる方は調べてみてください。

例とし、「person1さん(唯一、一人で映っている写真がある方です。)」の結果がこれです。

↓ 結果 ↓

「画像id: ~」がテストデータです。
ほとんど正解率1.0なのでちょっと胡散臭い感じですね。。。
person8さんの分が、0.9523809523809523なので微妙に間違っています。
精度高いのは嬉しい事ですが、今回は逆に全部1.0じゃなくて良かった。

↓ 不正解 ↓

画像を増やしまくったおかげか、予想よりも正解率が高い結果となりました。
K近傍法もけっこういい感じでしたが、今回の分はランダムフォレストに軍配が上がりました。

全員分の正解率の一覧です。

↓ 正解率一覧 ↓

最後に、無理やり「教師なし学習のクラスタリング」をやってみた結果です。

↓ 無理やりクラスタリングしてみた結果 ↓

今回は7枚の画像のみに対応したプログラムを書きましたが、
そのうち改めて新たな画像が何枚追加されても判定出来る様に作り直してみたいと思います。
全体的に言える事ですが、ハイパーパラメータの設定とかでもっと改良する事は可能のはずですね。
(本来はモデル評価しながらやるものですからね。。。)

また、回帰、クラスタリング、次元削減もそうですが
深層学習、強化学習、深層強化学習等にも挑戦したいと思います。

今回のお話については以上となります。
いずれまた何か面白そうな記事を書けたらいいなと思っています。
ありがとうございました。



2021年7月26日  new

将棋ゲーム<VBA>

始めまして、新入社員のK.Sです。
今回は、オセロゲームの発展課題として作成した、将棋ゲームについて紹介したいと思います!
まず将棋は、2人で行う定番なボードゲームであり、皆さんもご存知かと思います。お互いに自分の駒を動かしていき、相手の駒を取ったら勝ちというシンプルなゲームです。しかし、駒の種類によって動かせる範囲が違うことや、成り、2歩など、様々な難しいルールが存在します。将棋を作成するとなったら、そういった様々なルールをVBAで表現していかなくてはなりません。
そこで大事になってくるのが設計です。これから、おおまかな設計をしてみたいと思います。

実装するもの
・ボタンを押すと、盤面や駒がセットされる
・それぞれの駒の動き
・駒を移動させる
・成り
・王手の告知
・終了判定

これらを実装していけば簡単に将棋をつくることが出来ちゃいます!大まかな説明となりますが、1つ1つみていきたいと思います!

まず、ボタンを押すと、盤面や駒がセットされるようにしていきます。For文でループを回して値を出力していけば、簡単にセット出来ます。
何もない盤面から、

 


こんな感じで駒がセットされました!ついでに「対局開始」も表示させました。

次にそれぞれの駒の動きですが、これはその文字の駒をクリックしたら処理が行われるという条件を付ければ簡単です。クリックした駒が移動できる範囲を黄色にします。

次は、駒を移動させます!これは、駒を黄色にした事を活かして、黄色のセルをクリックしたら処理が行われるようにします。1つ前の工程で、クリックした駒の情報を保存しておき、黄色のセルとクリックした駒を入れ替える処理を行います。

持ち駒については、取った駒を持ち駒置き場に保存する処理をしておき、持ち駒を置く処理は先述した駒を置く処理を使用します。

 

続いて成りについてですが、もし自分の駒が、1番上の列から3列以内に駒が置かれれば「成りますか?」というメッセージを表示し、「はい」なら成り、「いいえ」ならそのままにする処理を行います。

 

「はい」を選択したので成りました!

そして王手の告知ですが、これは駒の動きの処理を作り変えれば出来ます。駒の動きの工程では駒の置ける位置を黄色くしましたが、王手の告知では黄色くせずに、もし駒の置ける位置に王があったならば「王手」というメッセージを出す処理を行います。

最後に、終了判定です。これは駒を移動させる処理に、もし移動先が王なら「p1の勝ち」というメッセージを表示させるだけです!

以上で将棋を作成する工程が終わりました!説明がだいぶ大まかになってしまい、もっと細かく説明したかったのですが、みなさんが作る時の答えになってしまうのでやめときます。もう少し実装しなければならない細かい機能などがありますが、おおまかには完成です。今回は、人vs人で作ったものですが、目指すところは人vs CPUなので、これからも改善していきたいと思います。
この将棋ゲームは、人vs人であればVBAの基礎を活かして簡単に作成できるものです!ぜひ作ってみてください。ありがとうございました。



2021年7月16日  new

ソートアルゴリズム

始めまして、新入社員のSTです。
今回は、ExcelVBAの研修の一環として行う、ソートアルゴリズムの発展として作った
VBAをご紹介したいと思います。

ソートアルゴリズムに関しては、過去の活動報告の記事にもなっておりますとおり、
私も課題としてソートアルゴリズムを実装しました。
アルゴリズムの実装は、プログラミングをする際に重要となる、論理的思考力を鍛えるのに非常に適したモノだと感じました。
アルゴリズムを調べるにつれ、数字を並び替える、それ一点の機能でありながらそれぞれのアプローチの違い、速度などの性能、ー今回は言及しませんが、要素による得手不得手など、非常に奥深いものでした。

そして今回作成しましたのは、それぞれのアルゴリズムのアプローチの違いを感じられるよう、グラフに数字がソートされていく様子をプロットするものとなります。
Wikipediaやアルゴリズムの解説動画などによくあるアレですね。

//バブルソートを実行している様子

//クイックソートを実行している様子

こちらは視覚的な分かりやすさを念頭に置いたもので、速度的には正しくはありませんが、
アルゴリズムにおけるアプローチの違いが感じられる面白いものが出来たと思います。
VBAはグラフが簡単に描画出来て良いですね。

こちらは速度の比較用として作ったものです。

指定した要素数のランダムな数字(重複なし)を配列にセットし、それぞれソートをかけるといったものです。
セルへの入出力や描画がない分、計算量オーダーに則ってある程度正しく計測できているはずです。
フォームの綺麗さはあまり考えずに作ったため、見苦しいものがありますが、
とりあえずシンプルに作ろうとした結果です。

圧倒的な速さを誇るクイックソートですが、当初は思ったようなパフォーマンスが出ず、シェルソートやコムソートより3倍近く遅れをとっている始末でした。
そこで再帰関数として実装していたものから、配列を使ったスタックを実装し、そこにソート範囲を渡すようにすることで、現在の圧倒的なパフォーマンスを誇るクイックソートを実装することが出来ました。
私は男の子なので、はやいものがとてもすきです。

ソートアルゴリズムの話をしておきながら、更にはコムソートなんてマイナーなものを実装しておきながら、マージソートを実装していないのは手落ち感があるのですが、時間の都合で実装に至らなかったと言い訳を残しておきます。

今回は全てVBAで作ったものとなりますが、やはりセルへの入出力やグラフへの描画が非常に負荷の高いものとなり、諦めた実装もいくつかあります。

視覚的に動きのあるものを作るのは楽しく、見る側も楽しんでもらえると思うのですが、
こと描画に関してはVBAでも便利な点はありつつも、限界を感じられた事も多くあり、後に作ろうとしたVBAでのピンポンゲームでもやはりパフォーマンスの悪さに挫折せざるを得ませんでした。

現在はC++にて簡単なゲーム作りに挑戦しており、また機会があればご紹介できればと思っております。
それでは、ありがとうございました。