2013年10月7日月曜日

Kaggle Hackathon!! ハッカソン!

先日、サンフランシスコのマイクロソフトで行われたKaggle Hackathonに、クラスメートと参戦してきました。

結果は8位。上出来です!

Kaggle Hackathonとは、24時間レースで、機械学習の精度を競い合うコンペです。

今回のテーマは、あるソーシャルネットワークのサイトのView数、コメント数、投票数を予測するというもので、そのサイトは、ある地域住民が地域の不満や改善してほしい点を投稿し、他のユーザーが、コメントしたり投票したりします。

そして、投票数が多いものに関しては解決が図られるというものです。たとえば、「道に落書きがあり、汚いから、なんとかして!」みたいな投稿に対して、投票されます。

うちのチームは人数あ多かったので、24時間の間でもいろいろな手が打てたのも好成績の要因だったと思います。私は、投稿のタイトルをテキストマイニングして、新たなダミー変数を作るということをしてました。表記ゆれ、スペルミスを正規表現で修正していくような感じですね。

残念ながら、作った変数はあまり予測力向上に役立ちませんでした。



オンサイトのコンペで良いのは、優勝者と話ができることです。優勝した方と話したら、テキストデータは最初に分析しないと決めていたといってました。データをざっと見て、あまり相関してなさそうだと見たということです。

さすが、洞察がするどい!自分は、そういう感覚がまだあまり備わっていないなぁと感じてしましました。データをざっと眺めて、最初にplay aroundしたときに、予測する変数と説明変数の間にどんな関係がありそうかを見出すというのが肝心だということです。

できることが増えると、やってみたい分析をやってしまうという陥りやすい罠にはまってしまうということを学習しました。

他のKaggleコンペにも参戦しているので、今回の教訓を活かします!でも、チームで8位とれたので、よしとしましょう!

2013年9月20日金曜日

(Pythonメモ)Google Financeのニュースヘッドラインを取得するPythonコード

株価とニュースの関係を分析してみたいなぁと思って、Google Finance (US)を取り込むコードを書いた。

getHeadkineという関数に、対象となる会社のticker、その会社の属するmarket(NASDAQなど)、検索対象となる開始日と終了日をstartとendというパラメータで指定すると、keyが日付、valueがヘッドラインの辞書を返す。

from __future__ import unicode_literals
import urllib2
import urllib
import re
from datetime import datetime,timedelta
import nltk

def getHeadline(ticker,market,start,end):
    query = urllib2.quote(ticker+':'+market)
    base = 'https://www.google.com/finance/company_news?q='
    url = base + query + '&startdate='+ start +'&enddate=' + end + '&start=0&num=10000'
    print url
    html = urllib.urlopen(url).read()
    raw = nltk.clean_html(html)
    raw = unicode(raw,errors='ignore')
    data = raw.split('\n')
    data =  data[60:-1]
    while u' ' in data: data.remove(u' ')

    monthDict = {'Jan':'01','Feb':'02','Mar':'03','Apr':'04','May':'05','Jun':'06','Jul':'07','Aug':'08','Sep':'09','Oct':'10','Nov':'11','Dec':'12'}

    news={}

    for i in range(0,len(data),1):

        t = re.match(r'[\s\w0-9/\.,:;\(\)]+\-\s([0-9\w\s]+)\sago\s*',data[i])
        o = re.match(r'[\s\w0-9/\.,:;\(\)]+\-\s(\w+)\s([0-9]+),\s(201[0-3])\s*',data[i])
        if t:
            hours =  int(t.group(1).split(' ')[0])
            delta = timedelta(hours=hours)
            gmt = timedelta(hours=7)
            d = datetime.today() - delta + gmt
            year = str(d.year)

            if d.month <10:
                month = '0'+str(d.month)
            else:
                month = str(d.month)
            if d.day < 10:
                day = '0'+str(d.day)
            else:
                day = str(d.day)

            key = year+'_'+month+'_'+day

            if key in news.keys():
                news[key].append(data[i-1])
            else:
                news[key]=[]
                news[key].append(data[i-1])

        if o:
            #Month
            m = o.group(1)
            month = monthDict[m]
            day = o.group(2)
            year = o.group(3)

            key = year+'_'+month+'_'+day

            if key in news.keys():
                news[key].append(data[i-1])
            else:
                news[key]=[]
                news[key].append(data[i-1])

    return news

#Example : getHeadline
#Output is a dictionary like this: { date : [headline1, headline2,.....], date:[headline3],......}
#the keys (time) is not ordered.Also, time is GMT (I checked the publish time in RSS xml).
#The function requires 'ticker', 'market name', 'start date'(YYYY-MM-DD) and 'end date' (YYYY-MM-DD)
print getHeadline('AAPL','NASDAQ','2012-09-01','2013-09-15')

2013年9月1日日曜日

秋学期 第1モジュール ここまでの内容

今週末はLabor Dayで3連休です。


少しゆっくりできるかと思いきや・・・


宿題の雨あられですので、気が抜けない状況です。


ここまでの学校の様子を残しておきます。


秋学期は8月中旬から12月中旬までの4か月間で、Analytics programは2か月ごとのモジュールに分かれています。最初のモジュールは、


  1. Business Communication for Analytics 【週2】
  2. Linear Regression 【週2】
  3. Data Acquisition (DA) 【週1】
  4. Exploratory Data Analysis (EDA) 【週1】
の4つの授業があります。これらに加えて、週1回のゲストスピーカーのプレゼンに出席するということになっています。


Business Communication for Analytics

International Studentにはもっとも過酷な授業です。授業が始まる前に、Program Directorから、英語をもっと練習しないとついていけないだろうと警告されたくらいです(単に、私の英語力不足ですが)。

この授業では、「技術的な内容を、それを知らない人に伝える」ということが大きなテーマになっています。なぜなら、分析は、専門でない人にとって難しく見えてしまいます。しかし、多くの場合、専門でない人が意思決定者であり、お客さんです。そのため、いかにインサイトをわかりやすく腹落ちさせるかというところが、非常に重要になるためです。

もちろん、Data Visualizationなど見た目が華やかでファンシーなコミュニケーション手法もありますが、この授業では、Writing, Speakingがフォーカスになっています。


Linear Regression

Boot Campの統計の授業の続きというのが実際の位置づけです。授業の名の通り、ひたすら、回帰分析を勉強しています。ちなみに使用言語はRです。


ここまでは、最小二乗法による回帰分析とその特性、モデルの診断の仕方を学びました。また、ロバスト回帰などもトピックに上がっています。私にとっては、学部のときには勉強しなかった、Cook's Distanceや、Leverageなんかも勉強できて、ハッピーです。


Data Acquisition (DA)

先生は実務で活躍されている方で、内容は実践的です。扱う内容は、分析ではなく、データ取得、クレンジングなどのデータ分析をする手前までのすべてということになります。使用言語はPython。


ここまでのところ、正規表現、JSONファイルとCSVファイル(マトリックス形式のデータセット)の円コーディング・デコーディングなどを扱っています。今後は、ソーシャルメディアのAPIなどにも触れる模様です。


Exploratory Data Analysis(EDA)

先生はシリコンバレーで仕事をしている実務家の方で、かなり実践的です。ちなみに、使用言語は、PythonとRです。
Data Acquisitionと少しかぶりますが、こちらは、集計、可視化に重きが置かれています。


今年、出願を検討されている方がいらっしゃいましたら、もっと詳しくお伝えできますので、ぜひご連絡ください!

ではでは、宿題に戻ります・・・