Pandasのケーススタディ2

データフレーム中の値Aを一斉にNaNに置き換える

df=df.replace(['A'],np.nan)

カラムAの値について個別に置換していく

df=df.replace({'A':{'Republic of Korea':'South Korea','United States of America':'United States',
                              'United Kingdom of Great Britain and Northern Ireland':'United Kingdom',
                             ....}})

カラムAの値についてN以上なら1それ以外なら0のカラムBを作る

df['B']=np.where(df['A']>=N,'1','0')

Pandasのケーススタディ

あるカラムについて最大値である行のindexを抽出

df['A'].idxmax()

二つの列の差の絶対値が最大である行のindexを抽出

df['new']=abs(df['A']-df['B'])
df['new'].idxmax()

データフレームのいくつかの列を用いて計算

df['Points']=df['A']*3+df['B']*2+df['C']

列Aの各値について、列Bのユニークな要素数を数え、それが最大である列Aの値を抽出

groupdf=df.groupby('A')
groupdf.B.agg(lambda x: len(x.unique())).idxmax()

列Aの各値について、列Bの値が大きいもの3つだけを見て、合計が一番大きかった列Aの値3つをリストで抽出

df['RANK']=df.groupby('A')['B'].rank(ascending=False)
top3df=df[df['B']<4]
groupdf=top3df.groupby('A')['B'].sum()
groupdf.sort_values(ascending=False,inplace=True)
grouplist=list(groupdf.index)
grouplist[:3]

5分でできる!株価予測

(※5分に環境構築は含めません)

簡単な株価予測を行います。

使っているライブラリは以下の3つなので、これらがあればすぐにやってみることが可能です

  • pandas
  • matplotlib
  • fbprophet



過去の株価データはこういったところから簡単に持って来れます。

kabuoji3.com



日本語が入っているとうまく動作しなかった(正確には分かりませんが消したら上手くいった)

ので、こんな感じにcsvのカラムは編集してあげてください

f:id:inaba00032:20190327123315p:plain
良い例



今回はある企業Rの株価データを使って予測してみます。

コードはこんな感じ

import pandas as pd
import matplotlib.pyplot as plt
from fbprophet import Prophet
from fbprophet.plot import add_changepoints_to_plot

price=pd.read_csv('任意の名前.csv')
model=Prophet(growth='logistic',yearly_seasonality=True,daily_seasonality=False,n_changepoints=8)
#Prophetでは日付カラムをds,予測したいカラムをyとする
price = price.reset_index().rename(columns={'date':'ds', 'start':'y'})
#非線形トレンドを用いる際に上限値を設定しておく
price['cap']=price['y'].max()+2500
model.fit(price)
future = model.make_future_dataframe(periods=60)
#株価は土日のデータが観測されないので...
future = future[future['ds'].dt.weekday < 5]
future['cap']=price['y'].max()+2500
fcst = model.predict(future)
figure = model.plot(fcst)
a=add_changepoints_to_plot(figure.gca(), model, fcst)
plt.show()



プロット図はこんな感じ

横軸日付,縦軸株価,黒い点は過去の株価データ,青い線がProphetの予測線です。

f:id:inaba00032:20190327122717p:plain
赤い点線はトレンド変化点,赤い線は全体のトレンドを示してくれてます



これって上手くいってるんでしょうか?実際の株価と合わせてプロット

(2018年までのデータを使っているので、2019年結果で比較します)

f:id:inaba00032:20190327123448p:plain
青は予測株価,オレンジは実際の株価



もちろん上手くは行っていない...

他の説明変数を加えたり、チューニングしたりも容易にできます

良いアイデアがある方は是非教えて下さい🙇‍♂️

日本メディカルAI学会公認資格を取りました

日本メディカルAI学会公認資格とは


医療×AI分野の研究を発展させ、国際競争力を高めることを目的とした資格です。

こちらを参照

japan-medical-ai2019.org

パート1とパート2に分かれています。それぞれの特徴をザッと述べます。

パート1


オンラインの講義資料を用いて以下を学びます。

講義資料はこちら

japan-medical-ai.github.io

評価

Googleフォーム形式で学んだ内容から問題が出され、4択で回答します。簡単

答案は結構すぐ帰ってくるので、期間中ならば何回も回答することができます。

パート2


国立がん研究センターに赴いて講義を受けます。

当日、100ページほどの冊子を渡され、それに従って8人の先生方の講義を受けました。

以下の内容を学びます。

  • 医療画像に対するAI導入例(近年研究されたモデルやデータ処理含む)

  • ゲノム情報に対するAI導入例

  • 医療AI導入メソッド(開発の流れや注意点)

  • 個人情報・生命倫理観点の注意

評価

こちらは出席して話を聞けば認定されます。形として一応程度の小テストがあります。

所感


オンライン資料


深層学習はtensorflowとpytorchを少しいじったことあるぐらいでしたがChainerも使いやすそうに感じました。

本来は一から訓練しなければならないモデルも、プリトレインされたものが簡単にロードできます。

また、Google Colabを用いていることもあって環境構築で詰まることのない点は非常に良いところです。

講義


第1回というところもあって、先生方も話す内容が明確には区分されておらず、やや冗長性はありました。

特に深層学習の基礎については多くの説明が設けられていたように思います。(後述)

現実にどのように医療にAIが導入されているか、またこれから導入する必要があるかを学ぶことができます。

医療にAIを導入するにあたって、法律に触れることのないように認証機関を通す必要があるなどその辺りのことは知らないことばかり。

また、ビジネスと同様に、明確に解きたい問題と目標値を定めてから導入に踏み切る必要があります。

ところで、冊子は1ページに4スライドずつ載っている形式。

スライド形式ならオンラインだと重たくなくて嬉しい...

ですが、アクセスできる端末を全員が持っているわけではないのでこの辺りは難しいところだと思います。

受講者について


講義はエンジニアリングよりの人、メディカルよりの人それぞれに向けて作られていました。

しかし、講義会場や学会の構成メンバーを見るとメディカルよりの方が多いように感じました。

講義会場でそう感じた理由が以下の2点

  • 講義会場で電子端末を弄っている人が少ない

  • 深層学習の基礎的部分に関する話はかなり丁寧に為された(逆に医療知識はそうでもない)

取る意味


資格が周囲からどう評価されるのかは分かりませんが、ふんわりAIに関する活動を実施していますぐらいのアピールになるんじゃないでしょうか(逆に、それだけにしかならないということでもあります。)

きっとどちらかといえばメディカルの方向けで、AI版ITパスポートのような感じだと思います。

(※ITパスポート試験を受けたことがないので偏見が含まれています。)

僕が取った理由は以下です。

  • バイオや医療×AIに興味津々

  • オンライン講義資料がバズっていて、どうせ読むならついでに取りたい

  • そもそも資格が好き(詐欺まがいのお金払えばすぐ取れるやつも取りたくなります。)

今後


機械学習は専門じゃないですが、昨年はインターンを経験することができ、今年も春休みはR社にお世話になる予定です。

研究分野がバイオでも機械学習でもないのでアレなんですが、バイオ×AIが実践できるようなところを探したいなーって考えてます。

個人的に今回お話が出てきたヒューマノーム研究所とか行ってみたいです。

【ABC 115】D. Christmas を視覚的に見て分かりやすく考える

f:id:inaba00032:20181215171634p:plain
問題文他

f:id:inaba00032:20181215171848j:plain
バーガーの厚さとパティの枚数の関係

f:id:inaba00032:20181215171939j:plain

f:id:inaba00032:20181215172059j:plain

f:id:inaba00032:20181215172201j:plain

ソースコード



N,K=map(int,input().split())
 
thickness=[1]*(N+1)
Npatty=[1]*(N+1)
 
for i in range(1,N+1):
  thickness[i]=2*thickness[i-1]+3
  Npatty[i]=2*Npatty[i-1]+1
 
#print(thickness,Npatty)  

def countpatty(N,K):
  
  if K==1:

    if N==0:
      return 1
    else:
      return 0

  if 2<=K<=thickness[N-1]+1:
    return countpatty(N-1,K-1)

  if K==thickness[N-1]+2:
    return Npatty[N-1]+1

  if thickness[N-1]+3<=K<=thickness[N]-1:
    return Npatty[N-1]+1+countpatty(N-1,K-2-thickness[N-1])

  if K==thickness[N]:
    return 2*Npatty[N-1]+1
 
print(countpatty(N,K))


【3Daysインターン】無から始めるテキスト分類コンペ

Gunosyさんのインターンに参加してきました。

題材:ニュース分類

タイトルや記事の内容から、あるニュースがどのカテゴリに所属するかを分類します。

結果は単純に分類精度で評価します。(正しく分類できた記事数/全体の記事数)



分からない



何やれば良いか分かりません...

というわけで似た問題と解法がないかを調べました

コンペということで、kaggleに似たような処理のものがあるかなーと考えました



Mercari Price Suggestion Challenge | Kaggle


ところがノウハウは直接使えそうにありませんでした。僕の認識では以下の2点が異なります。

  • 回帰と分類では問題の性質が異なる(上記は値段の回帰問題)
  • 英語のテキスト処理と日本語のテキスト処理は異なる(語の分かれなど)


調べ直し

似たようなデータセットlivedoorニュース分類のデータセットがありました

www.rondhuit.com


こちらのデータセットに対して分類を行っている記事を参考にすることにしました



qiita.com

qiita.com

MeCab と scikit-learn で日本語テキストを分類する | tyamagu2.xyz

qiita.com

日本語の処理では分かち書きという手法を主に用いるようです(MeCabなど)

主に語の頻出度などを考慮したTfIdfVectorizerを用いて

タイトルに含まれる名詞のみを用いるなど前処理を行っていきます

結果

終結果は15人中6位でした

以下の点を踏まえるとさらに結果は良くなりそうでした


  • タイトルの一部を特徴量として入れる
  • タイトル・本文の最初や最後の文字を特徴量として使う
  • 記事ごとに特徴的な記号が含まれている場合があるのでそれらを考慮する

コンペに参加したのは初めてでしたが雑感としてはかなり楽しめたかなーと思います!

研究の合間にkaggleとか触れたらなーと思ったりしました