shimizu-softwareの自己紹介(MENTA補足)

はじめに

このページはMENTAというサービスの利用を検討している方向けに、私(ユーザ名:shimizu-software)の自己紹介をしているページです。

このページの目的

私に興味を持ってくださった方が、私に連絡をするにあたりMENTA上の情報だけだと説明不足だなと感じ、連絡しにくいかもしれないと考えています。このページは、その点を補足する目的で書いています。

MENTAで最も大切にしていること

それは、メンティーさんの課題を解決することです。ここでいう「課題」とは、メンティーさんが意識しているものだけでなく、意識していないものも含みます。たとえば、

「プログラミング言語PHPの参考書について質問させて下さい」というメッセージをいただいた場合、その背景について伺います。そこで「機械学習エンジニアを目指すために、PHPの勉強をしている」というお返事をいただいたとします。(あくまで例です)

(機械学習によく利用するプログラミング言語はPythonという言語なので)「なぜPHPを学習しているのか」を丁寧にヒアリングさせていただきます。その上で「そもそもPHPではなくPythonの勉強をしたほうが良いかもしれません」といったように、ご相談の内容と違うご提案することもあり得ます。

もちろんPHPの学習が活きる場面もありますし、モチベーションの観点でもメンティーさんの自主性が重要ですので、こちらの意見を押し付けるようなことは致しません。

こういったやりとりを通じて「(意識していないものも含む)課題」を解決させていただきます。

なぜか

メンターとして最低限やるべきことは「いただいた報酬の範囲で、できるだけメンティーの要望に沿うようにサービスを提供すること」だと思います。一方で、メンティーさんの要望は短期的・表面的なものや前提を誤解されているものもあります。私がMENTAで実現したいことは「メンティーさんが真に目指しているゴールへ向かうお手伝いをすること」です。これを実現するためには、メンティーさんが抱えている本当の課題は何かということを一緒に考えた上で、サポート内容をすり合わせていくことが必要だと考えています。

料金

私に期待していることをメッセージで伺った上で、判断させていただきますが目安としては以下のような報酬をいただいております。

  • 45分間のビデオ通話:4000円
  • 1ヶ月間のチャットでのサポート:5000円

あくまで目安です

扱っている内容が高度な場合はもう少し高い報酬を提示させていただくことがありますし、逆に学生さんなどであればもう少し低い報酬でお引き受けさせていただいております。いずれにせよ、まずはご相談いただければと思います。

料金の理由

、MENTAで活動している理由が「MENTAで最も大切にしていること」に記載した通りで、そこまで営利を目的にしていないのですが、ありがたいことに大変多くの相談がありプライベートの時間とのバランスをとるために現在の料金設定になっています。

コミュニケーション

ビデオ通話の場合はZoom、チャットの場合はSlackでお願いすることが多いです。もちろん、メンティーさんの事情にあわせて別の手段も検討はいたします。Zoomの場合はカメラはON/OFFどちらでも結構です。希望がある場合は仰って下さい。

正社員として勤務しているので、チャットのレスポンスなどは大抵は24時間以内、最大で48時間程度かかります。また、ビデオ通話についても「今日、お願いしたい」とご連絡をいただいてもお返事自体が間に合わない可能性もございます。余裕を持ってご連絡いただけますと幸いです。

※現在、多忙にしておりビデオ通話のみお引き受けしており、チャットのプランについては基本的にはお引き受けしておりません。

スキル

以下のようなスキルセットを持っています。

大抵の内容はサポートできる

  • Python
  • 機械学習

基本的な内容であればサポートできる

  • HTML
  • JavaScript
  • CSS
  • PHP
  • Java
  • Ruby
  • SQL
  • GCP
  • AWS
  • Linux

キャリア

  • 学生時代:大学・大学院で機械学習を研究
  • 前職:機械学習エンジニア・データサイエンティストとして勤務
  • 現職:Web系企業で機械学習エンジニアとして勤務しながら、副業としてMENTAで活動中

新卒・中途で機械学習エンジニアとして就職した経験があるため、希望があればそういったお話もできます。前職・現職の企業名についてもお伝えできます。

また、キャリアのご相談に乗ることもできます。

よくあるご相談内容

ご相談内容にはいくつかのパターンがあります。

1. 未経験から機械学習エンジニア/データサイエンティストとして転職したいです

とてもよくあるご相談ですが、正直なところ難易度は高いので覚悟が必要です。個別にお話を聞かないとなんとも言えませんし、転職できるかはもちろん本人次第です。しかし、私の経験の中で転職可否についてある程度のパターンが見えてきました。以下のチェックリストである程度評価できると思います。

  • 業務の中身がイメージできているか?

業務の中身は具体的にイメージできていますか?仕事は職種ではなく中身が重要です。自分のやりたいことが明確で、そういった業務ができる職種を調べてみたら「機械学習エンジニア」「データサイエンティスト」という言葉がヒットした。という展開なら良いですが、「なんとなく流行っているから」「なんとなく高収入なイメージがあるから」という動機だと少し危険だと思います。もちろん、それをきっかけに中身を調べて魅力を持てているなら大丈夫です。職種や働き方ではなく、中身に対してモチベーションを持ちましょう。

  • 転職したい企業が具体的か?(特にデータサイエンティストの場合)

前の項目にも関連するのですが、転職に向けて学習計画を立てる際にAI・データサイエンス領域の全てを網羅しようとすると、とてつもなく時間がかかっています。実際に働いている人も全てを網羅的に理解しているわけではなく濃淡があります。そのためAI・データサイエンスの勉強をするのではなく、「自分が行きたい企業をある程度のまとまりとして定め、その最大公約数を勉強する」というスタイルが最も効率が良いです。そのためにも、行きたい企業を整理してみましょう。求人サイトなどで複数の企業をピックアップして比較してみることをおすすめします。

  • 学習時間が確保できるか?

その方の元々のスキルによりますが数百時間単位で勉強が必要になります。そのため、まずは学習時間を確保できるかが重要です。たとえばですが、非ITのホワイト企業に勤めており学習時間が確保できる方は、あまり転職を急がずに今の環境できちんと学習してから転職をする戦略をとったほうが良いです。

  • 論理的な思考ができるか?

少し触れにくい話題ですが、避けては通れません。プログラミングや分析というのは論理的な思考の連続です。これまでのご自身の学生時代、キャリア、趣味を振り返ったときに論理的な思考を必要とするものがある程度は得意な自覚がある方は安心できます。一方で、そういった経験がない場合は可能性は未知数ということになります。適性がないといっているわけではなく、判断の材料に欠けるということです。そういった方は、まずはプログラミングを始めてみて自分が受け入れられる世界かどうかを見極めることが重要だと思います。

  • 過去のキャリアで活かせる要素があるか?(特にデータサイエンティストの場合)

「全く未経験ですがデータサイエンティストになりたい」と仰る方は多いですが、これまでの経験とデータサイエンティストが無関係と決めつけるのは早計です。あなたはデータサイエンティストになって、どんなデータを分析したいのですか?その回答次第ではチャンスがあります。データ分析の業務では、サイエンスやエンジニアリングの力が求められますが、ドメイン知識つまり業界の知識が求められるケースがほとんどです。例えば、人材紹介会社でデータ分析を利用と思ったときに人材紹介のビジネスモデルを理解する必要があります。つまり、何らかの業界経験があるということは、その業界のデータを分析するという文脈において既に有利な立場にあるということです。「今の業界から離れて、とある業界に行きたい」「今の業界ではデータ分析のニーズがない」といった事情でしたら仕方がありませんが、観点の一つとして持っておくと良いと思います。

2. 作りたいアプリケーションがあります

こちらも良くいただくご質問です。学習の方向性としてとても健全ですし、積極的にお手伝いさせていただいております。一方で、Webフレームワークに固有の問題などは、考え方をお伝えすることはできても直接答えをお伝えすることはできないかもしれません。一緒に考えるようなサポートを希望される方に向いています。

最後に

ゴチャゴチャ書きましたが、実際はもっとラフな感じで楽しくお話できると思います!お気軽なご連絡待っています!

https://menta.work/user/24445

記事情報

  • 投稿日:2022年2月20日
  • 最終更新日:2022年3月2日

データサイエンティストを目指すためのロードマップ

はじめに

なぜこの記事を書いたか

「どうすれば未経験からデータサイエンティストになれますか?」というご質問をよくいただくので、自分なりに「今、自分が初学者に戻ったらこのようにデータサイエンティストを目指すだろう」というロードマップを整理しました。どなたかの参考になれば幸いです。

注意

ここ数年ですが、データサイエンティストという職業を過度に持ち上げるような情報が多く、過度な期待を寄せている方が多いように感じます。当然ですが、(データサイエンティストをはじめ他の職業も含めて)その職業につけば何でもうまくいくということはありません。働き始めてからが大変ですし、あなたの思ったような働き方ではないかもしれません。そういったリスクも踏まえてデータサイエンティストを目指されるのであれば、この記事は参考になると思います。また、リスクを軽減するための方法についても触れています。

ロードマップ

1. なぜデータサイエンスを仕事でやりたいのかを整理する

当たり前のステップのように思われるかもしれませんが、ここの整理が甘い方はとても多いです。恐らくですが「はじめに」で述べたように、データサイエンティストを過度に持ち上げる情報が多いためであったり、名前が何となくかっこいい(!?)ためだからでしょうか。

職種自体はあまり本質的ではなく、重要なのは仕事の中身です。データサイエンティストを目指すということは、「データサイエンスを仕事にしたい」という動機が明確に言語化できるようになるべきです。「実はデータサイエンスを仕事にしたいとは考えていないかもしれない」と思われるのであれば、少し時間をとって自分がやりたいことを掘り下げてみるのが良いかと思います。

実は、このステップは今後の勉強の効率に大きく影響します。
というのも、「データサイエンティスト」は定義が非常に曖昧であるためです。

どういうことかというと、各企業ごとにデータサイエンティストという職業の職務内容に大きなぶれがあるため、データサイエンティストを目指すということ自体がかなり抽象的な目標になってしまうからです。具体的には「勉強すべきことが多すぎる」という課題にぶちあたってしまいます。もちろん、中長期的には、多くのことを勉強しておいたほうが仕事の役にも立ちますし、次に他の企業でデータサイエンティストとして働こうと思ったときにも有利です。しかし、あなたは今はそんなことは言っていられないはずで、「できるだけ効率よく」勉強すべき対象を明らかにするべきです。

整理できたら次のステップに進みましょう。どうしてもうまく整理できない場合は、次のステップの中で整理すると良いでしょう。

2. 実際にデータサイエンティストの話を聞く

次に、実際にデータサイエンティストとして働いている方の話を聞きましょう。以下のような目的があります。

  • あらためて自分が目指す職業のイメージを掴む
  • データサイエンティストという抽象的な職業において、複数人に共通している(していない)職務・スキルを知る
  • 自分の背景からデータサイエンティストを目指すことに対する、客観的な意見を得る

問題はどうやってデータサイエンティストにコンタクトをとるか?ですが

  • MENTA
  • ココナラ
  • crowdworks

あたりが良いかと思います。1時間あたり~3000円程度の報酬で、きちんと活躍されているデータサイエンティストの方に話を聞くことができると思います。私もご対応させていただいております。

3. 学習計画を立てる

データサイエンティストを目指す決心がついたら、いよいよ学習計画を立てます。学習期間は各々のバックグラウンドによると思いますが、半年〜1年程度はかかると思ってください。

学習計画の立て方ですが、私は企業の募集要項から逆算する方法を推奨しています。ここまでのステップであなたが「データサイエンティストという職業に求めていること」が具体的になってきていると思うので、その内容を満たす企業を複数ピックアップしてください。そして、その企業の募集要項に共通しているスキルから勉強していきます。一つ注意しておくと、最終的にその企業の面接を合格することは目標にしなくても良いです。なぜならあなたが勉強している間に募集は終了してしまうかもしれませんし、他に良い企業が出てくる可能性もあるからです。ここでは、あくまで「学習計画を立てるための目安としてピックアップしている」ということです。もちろん、本当に行きたい企業が見つかれば、それは良いことですのでそこを目指してもよいでしょう。

学習項目として、以下のようなものが整理されていくイメージです。

  • 数学
  • 機械学習
  • 統計学
  • Python
  • ソフトウェアエンジニアリング
  • SQL
  • BIツール
  • ビジネススキル

次にそれらを「いつまでに」「どこまで」「どうやって」学習するのかを決めます。

いつまでに

あなたの中で譲れない転職のタイムリミットがあると思います。それと、理想的に必要な勉強量とのバランスをみて設定することになります。根拠が正確でなくてもいいので、「いつまでに」という期限は設定してください。これがあるとないとでは学習のメリハリが全く違ってきます。

どこまでに

募集要項に具体的な記述があれば、それが参考になるでしょうし曖昧であれば自分で調べて設定することになります。自分で判断が難しそうであれば、この段階で再びデータサイエンティストの方にコンタクトを取るのも良いと思います。

どうやって

「〇〇」「勉強方法」とGoogle検索すれば様々な勉強方法がでてくると思うので、自分にあったものを選択すると良いでしょう。ここもやはり難しければ、データサイエンティストの方に相談しても良いと思います。

4. 学習する

ここは計画の通りに学習をすすめるだけです。独学が難しければ、メンターなどをつけても良いかもしれませんがスクールなどはあまりおすすめしません。理由としては、スクールに通うとその課題をクリアすることが目的になってしまい「定めた学習項目の到達目標を達成する」という学習の目的からぶれてしまうためです。この目的を達成するためには独学ですすめるかメンターにマンツーマンでみてもらうかのどちらかしかないはずです。

5. 面接をうける

ここまでくれば後は面接を受けるだけです。長い期間勉強してきたのでいち早くオファーを得ようと焦ってしまいがちですが、当初の目的を忘れずじっくりと進めていきましょう。あまりにも面接に落ちてしまう場合は、これまでのステップのどこかが欠けている可能性があります。企業によってはフィードバックがもらえる場合などもあるので、それを参考に勉強しなおすかどうかを検討しましょう。

記事情報

  • 投稿日:2022年1月16日
  • 最終更新日:2022年1月16日

MENTAの使い方

はじめに

この記事ではMENTAでメンターを募集する方法について紹介します。

MENTAの使い方

募集の作成方法

ログイン後、画面の右上の「作成」ボタンをクリックします。

「募集を作成」をクリックします。

募集内容を埋めていきます

メンターにお願いしたいこと

ここはできるだけ丁寧に書いた方が募集が集まりやすいです。

「長期でお願いしたいがまずは話だけ聞いてみたい」といった場合など、細かい要望があれば記載しましょう。

予算

「継続」は月額制で長期的なサポートを依頼したい場合に利用します。
「単発」はそうでない場合に利用します。

最終的には、応募してくれたメンターさんとチャットでやりとりした上で、メンターさんが契約を作成する形になります。
そのため、この時点での内容が絶対というわけではないので神経質に考えなくても大丈夫です。

応募が来たら

かなりの割合で複数の応募があると思います。びっくりせずに丁寧に一人ずつ応対しましょう。
メンターさんと実際にチャットでやり取りをしながら自分にあっている方を探しましょう。
無理に契約を進めてくる方やスキルが不足していそうな方には注意しましょう。

断る場合はメッセージをすると親切ですが、そのまま無視される方も多いので無視でもそこまで失礼にはならないと思います。

メンターさんが見つかって契約の作成まで進んだら、募集は削除しておくと他のメンターさんが応募できなくなるので親切です。
募集と契約は特に紐付かないので、削除しても問題がありません。

さいごに

私自身もMENTAでメンターをしています。もしMENTAの使い方でわからないことがあれば、私への依頼のあるなしに関わらずDMを送っていただければ使い方のご説明をさせていただきます。

https://menta.work/user/24445

記事情報

  • 投稿日:2022年1月10日
  • 最終更新日:2022年1月10日

推薦システムに関する情報が集まるページ

用語

協調フィルタリング

ユーザまたはアイテムの素性を利用せず、ユーザのアイテムに対する過去のレイティングに基づいて予測を行う手法。
推薦システム: 統計的機械学習の理論と実践

内容ベースフィルタリング(content-based filtering)と横並びになる概念。
推薦システムのアルゴリズム
Candidate Generation Overview

クエリ(コンテキスト)

システムが推薦を行うために使用する情報。

  • ユーザ情報(ID、ユーザが以前に操作したアイテムなど)
  • 追加のコンテキスト(時刻、ユーザーのデバイスなど)

Terminology

セレンディピティ

目新しさに,思いがけなさ,予見のできなさ,または意外性の要素が加わった概念。
推薦システムのアルゴリズム

多様性

推薦リストに含まれるアイテムが互いに似ていないこと。セレンディピティを定量化する試みの一つ。
推薦システムのアルゴリズム

内容ベースフィルタリング(content-based filtering)

検索対象の内容を考慮して推薦する。
推薦システムのアルゴリズム
あるユーザへの推薦にあたり、他のユーザに関するデータが必要ない。
Content-based Filtering Advantages & Disadvantages

ランク学習 (learning to rank)

クエリが与えられたら文書のランクを予測し、そのランクに従って並べ替えることで結果リストを組み立てることができる。このような問題を学習することをランク学習という。
AIアルゴリズムマーケティング 自動化のための機械学習/経済モデル、ベストプラクティス、アーキテクチャ

folding

https://developers.google.com/machine-learning/recommendation/dnn/training
Folding: Why Good Models Sometimes Make Spurious Recommendations

Position-based Model(PBM)

C(クリックデータ), O(アイテムがユーザに見られているか否か), R(真の嗜好情報)という3つの確率変数を用いてポジションバイアスの影響を表現するモデル。ポジションバイアスの推定にはいくつかの手法があり、EMアルゴリズムベースの手法であるRegression-EMは、ログデータのみから推定が可能。
施策デザインのための機械学習入門〜データ分析技術のビジネス活用における正しい考え方

ライブラリ

Implicit

暗黙的フィードバックのデータセット用のPythonによる協調フィルタリングのライブラリ

アーキテクチャ

レコメンデーションシステムの一般的なアーキテクチャの1つは、次のコンポーネントで構成される。

  • candidate generation
  • scoring
  • re-ranking

Recommendation Systems Overview

参考書籍

推薦に関する和書は少なく、下記で買い揃うと思います。

推薦システム: 統計的機械学習の理論と実践

情報推薦システム入門 -理論と実践-

集合知プログラミング

AIアルゴリズムマーケティング 自動化のための機械学習/経済モデル、ベストプラクティス、アーキテクチャ

施策デザインのための機械学習入門〜データ分析技術のビジネス活用における正しい考え方

記事情報

  • 投稿日:2021年9月18日
  • 最終更新日:2021年10月3日

C++, Java, Pythonにおける赤黒木の実装

はじめに

赤黒木は平衡二分木の一種で、探索・挿入・削除の時間計算量がO(log n)である。この記事では、C++, Java, Pythonでそれぞれどのように利用するかをメモしておく。

C++

std::mapを使えばOK。
https://en.cppreference.com/w/cpp/container/map

Java

java.util.TreeMapを使えばOK。
https://docs.oracle.com/javase/jp/1.4/api/java/util/TreeMap.html

Python

組み込み型であるdictはハッシュテーブルで実装されているようです。
https://docs.python.org/ja/3/library/stdtypes.html?highlight=dict#mapping-types-dict
https://stackoverflow.com/questions/327311/how-are-pythons-built-in-dictionaries-implemented
https://softwareengineering.stackexchange.com/questions/234793/why-does-python-use-hash-table-to-implement-dict-but-not-red-black-tree

赤黒木を利用したい場合は以下のライブラリを用いると良さそうです。
https://pypi.org/project/bintrees/

記事情報

  • 投稿日:2021年8月21日
  • 最終更新日:2021年8月21日

scikit-learn 0.24に関するメモ

scikit-learn 0.24でよく使う便利な機能に関するメモです

sklearn.semi_supervised.SelfTrainingClassifier

https://scikit-learn.org/stable/modules/generated/sklearn.semi_supervised.SelfTrainingClassifier.html

教師あり分類器を半教師あり分類器として機能させるクラスです。

アルゴリズムの概要は以下のようになります。

  1. ラベル付きデータで学習
  2. ラベルのないデータを予測
  3. 予測値をトレーニングセットに追加

そのため、教師なし学習のように全くラベルが付いていないデータでは学習させることができないので注意して下さい。

1
2
3
4
5
6
7
8
9
10
11
import numpy as np
from sklearn import datasets
from sklearn.semi_supervised import SelfTrainingClassifier
from sklearn.svm import SVC
rng = np.random.RandomState(42)
iris = datasets.load_iris()
random_unlabeled_points = rng.rand(iris.target.shape[0]) < 0.3
iris.target[random_unlabeled_points] = -1 # -1がラベルなしを表す。
svc = SVC(probability=True, gamma="auto")
self_training_model = SelfTrainingClassifier(svc)
self_training_model.fit(iris.data, iris.target)

predict_probaメソッドを持つ、全ての分類器で利用が可能です。疑似ラベルを付与する際に閾値を用いて付与するかを決めるため、predict_probaが必要なのだと思います。

おまけ

半教師あり学習に関する記述がある書籍です。

  • 機械学習 100+ページ エッセンス

記事情報

  • 投稿日:2021年8月20日
  • 最終更新日:2021年8月20日

Javaでの競技プログラミング

はじめに

Javaにおける競技プログラミングのメモです

計算量

List

ArrayListとLinkedListの使い分けについて

get()

ArrayListはランダムアクセスには強い。

  • ArrayList O(1)
  • LinkedList O(n)

add(element)

末尾に要素を追加するメソッド。

ArrayListは新たにArrayが生成されてしまうケースにおいてO(n)となるが、それ以外のケースではO(1)。どのような場合にArrayの生成が発生するかは記述が見当たらなかった。

  • ArrayList O(1)->O(n)
  • LinkedList O(1)

add(index, element)

任意の場所に要素を追加する場合。LinkedListもインデックスにたどり着くまでにループを回す必要があるため、O(n)である点に注意したい。

  • ArrayList O(n)
  • LinkedList O(n)

remove(element)

リストは、要素を検索する必要があるためO(n)です。

  • ArrayList O(n)
  • LinkedList O(n)

remove(index)

LinkedListはgetと同じようにランダムアクセスにO(n)ですが、ArrayListもO(n)です。削除そのものはO(1)であるものの、削除後にシフトが必要となるためです。

  • ArrayList O(n)
  • LinkedList O(n)

ただ、シフトよりもループのほうがコストが低いため、LinkeListの方が好ましい。

参考

下記のページを参考にしました。

記事情報

  • 投稿日:2021年8月19日
  • 最終更新日:2021年8月19日

Python3.9の新機能に関するメモ

はじめに

Python3.9の新機能のうち、気になるものをメモしておきます。

PEP 584, union operators added to dict;

dictでmerge(|)やupdate(|=)が使えるようになりました。
キーが重複している場合の挙動が気になりますが、右側のオペランドが優先される仕様です。

1
2
3
4
5
a = {'a':1, 'c':1}
b = {'b':2, 'c':2}
print(a|b)
a.update(b) # インプレースに更新。なお、a|=bでもOK
print(a)

PEP 616 – String methods to remove prefixes and suffixes

文字列に対して、prefixやsuffixを指定して存在すれば削除する機能です。

1
2
3
4
5
6
7
8
9
>>> st = 'abc'
>>> print(st.removeprefix('a'))
bc
>>> print(st.removeprefix('c'))
abc
>>> print(st.removesuffix('a'))
abc
>>> print(st.removesuffix('c'))
ab

記事情報

  • 投稿日:2021年8月16日
  • 最終更新日:2021年8月16日

サービスアカウントにKubernetes Engine Cluster 管理者権限を付与しているのにGKEへのデプロイに失敗する

状況

タイトルの通りの状況で、以下のようなエラーが発生する。

1
Error from server (Forbidden): deployments.apps is forbidden: User "XXXXXXXXXXXXXXXXXX" cannot list resource "deployments" in API group "apps" in the namespace "default": requires one of ["container.deployments.list"] permission(s).

結論

Kubernetes APIを利用するので、Kubernetes Engine Cluster 管理者権限ではなくKubernetes Engine 管理者 が必要です。

記事情報

  • 投稿日:2021年7月21日
  • 最終更新日:2021年7月21日