アサトの実験blog

Pythonでの自動化とか、IT関連で興味のあるテーマについて色々実験する場所です

Kaggle Learn

さて、Kaggle Learnです。 Kaggle Learnって何?っていうと、前の記事の続きで、Tutorialsを選ぶと Kaggle Learn と書かれたページに飛びます。

↓こんな感じ f:id:asato418:20180911231716p:plain

で、リンクをクリックすると、下のページに飛びます。 f:id:asato418:20180911231843p:plain

リンク先では、 Python, Machine Learning(機械学習)、Pandas, Data Visualizaition, SQL, R, Deep Learning についてのコースがあります。

色々と、各々の項目についての初歩の解説があるので、興味のあるかたは読んでいくのもよいかもしれません。・・・ 

と、なんか私にとって興味があることが一杯だったので脱線していろんなことやってたら時間がかなりすぎてしまいました。。 (機械学習のところ読んだり、 Jupyter Labでのスライドショーの作成のページ読んだりしてたら1時間以上過ぎてた。。。)

続きは明日。。

Kaggle: Titanic: Machine Learning from Disaster(内容)

さて、Kaggleです。 Prarctice Skillsの所に行くと

Competition Description

The sinking of the RMS Titanic is one of the most infamous shipwrecks in history. On April 15, 1912, during her maiden voyage, the Titanic sank after colliding with an iceberg, killing 1502 out of 2224 passengers and crew. This sensational tragedy shocked the international community and led to better safety regulations for ships. One of the reasons that the shipwreck led to such loss of life was that there were not enough lifeboats for the passengers and crew. Although there was some element of luck involved in surviving the sinking, some groups of people were more likely to survive than others, such as women, children, and the upper-class. In this challenge, we ask you to complete the analysis of what sorts of people were likely to survive. In particular, we ask you to apply the tools of machine learning to predict which passengers survived the tragedy.

Practice Skills

・Binary classification ・Python and R basics とあって、その下に動画なんかも貼ってあります。当然全部英語です。 まあ一応私 TOEIC 900点とったこともあり、この程度の英語であれば平気です(ちょっと自慢げ)
さらっと英語を読んでみると ・タイタニック号の沈没は歴史上もっとも有名な難破です。 ・1912年 4/15日、処女航海中に、タイタニックは氷山にぶつかって沈み、2224人の乗客及乗組員のうち、1502人が死亡。 ・センセーショナルな悲劇は国際コミュニティにショックを与え、船の安全基準をよくする動きにつながりました。 ・難破がそれだけの生命を失う事故に至った理由の一つは、乗客及び乗組員のための究明暴徒が十分になかったことです。沈没から生き残るいくつかの幸運もあったものの、いくつかのグループの人々はその他のグループの人々より生き残っていました。例えば、女性、子供、および上流階級の人々です。 ・このチャレンジでは、どのような種類の人々が生き残りそうであるかの分析をあなた方に競っていただきます。我々は、どの乗客が悲劇から生き残るかを予想する機械学習のツールを適用していただきます。

実践スキル

二項分類 Python 及び R の基礎 ということで、要は Pythonとか Rを使って、どの乗客が生き残るかを予想する機械学習ツールの開発を行うってことですね。(きっと) そもそも二項分類(Binary Classification)って何?って感じですが。。まあチュートリアルやればわかるようになる。。と信じてみます。

閑話 今実際にコンペが行われているものとしては、

TGS Salt Identification Challenge | Kaggle

がありますね。賞金 100,000 $ だそうです。一人で勝ち取ればウハウハですね(夢)

f:id:asato418:20180911230501p:plain

Overview (概要)のDescription(記述)を読み終えると、その下には Evaluation(評価) Tutorials (チュートリアル) Frequently Asked Questions (よくある質問。いわゆる FAQ) があり、さらに上のメニューには Data, Kernels, Discussion, Leaderboard, Rules, Team という項目があります。 まあ、素直に Evaluation, Tutorialsへと進みます。 Evaluationには、

Goal

It is your job to predict if a passenger survived the sinking of the Titanic or not. For each PassengerId in the test set, you must predict a 0 or 1 value for the Survived variable.

Metric

Your score is the percentage of passengers you correctly predict. This is known simply as "accuracy”.

Submission File Format

You should submit a csv file with exactly 418 entries plus a header row. Your submission will show an error if you have extra columns (beyond PassengerId and Survived) or rows. The file should have exactly 2 columns: PassengerId (sorted in any order) Survived (contains your binary predictions: 1 for survived, 0 for deceased)
と書かれてます。 まあ要するに、先ほど概要の所で書いてあった、生き残り予測をおこなって、正確性を競うってことが書いてあります。で、ファイルフォーマットは 892, 0 893, 1 というように、乗客IDと、生き残ったか(1), なくなったか(0) かというフォーマットで提出するってことのよう。
長くなったので、チュートリアルは次の記事に書きます

Kaggle

さて、とにかく何か新しいことを始めよう。。。

ということで最近話題の? kaggle
Kaggle: Your Home for Data Science にアカウントを作成してみました。

Pythonを選ぶと、次のようなメニューが f:id:asato418:20180910235525p:plain

今日は自動投稿のバグ取りに時間がかかっちゃいましたが、ちょっと Kaggleを勉強していきたいと思います。

ちょろっとだけ、多くの人が試しているタイタニック号のテストデータを見るところまでだけ進めました。

f:id:asato418:20180911000904p:plain

Jupyter Notebookはcsvとかの表示も簡単にできていいですよね。 明日から他の人がやってるチュートリアルに沿って試していきたいと思います。

バグ対応(https://kyouno-ryouri.hatenadiary.jp/)

まあただの実験だったので放置でもいいんですが、さすがに毎日同じ料理の情報が書き込まれ続けるのは恥ずかしいので、簡単な逃げを。。

一番先頭の料理情報だけをとってたんですが、とりあえず find_allにして、全リストをとってきたうえで、乱数でどれか一つを表示する形に変更しました。まあたまには同じ料理が続く場合があるかもしれませんが、まあそれは放置(w

まあ超適当に記事をとってくる部分を簡単に修正。。。

def get_todays_food():
    # ヘッドラインニュースのタイトル格納用リスト
    news_data = []

    # urlの指定
    url="https://www.kyounoryouri.jp"
    search_url = "https://www.kyounoryouri.jp/recipe/ranking"

    # ユーザーエージェントを指定
    ua = 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:60.0) '\
     'AppleWebKit/537.36 (KHTML, like Gecko) '\
     'Gecko/20100101 Firefox/60.0 '

    req = urllib.request.Request(search_url, headers={'User-Agent': ua})

    #htmlの取得
    html = urllib.request.urlopen(req)
    # htmlパース
    soup = BeautifulSoup(html, "html.parser")
    topicsindex = soup.find('div', attrs={'class': 'recipe--ranking-list'})

    # class「topicsindex」内から記事タイトルを抽出
    list1=topicsindex.find_all('img')
    list2=topicsindex.find_all('div',class_='col')
    num=random.randint(0,len(list1)-1)

    # 記事タイトルとURLを保存
    link=url+list1[num].get('src')
    #print(link)
    body=url+list2[num].get('data-url')
    #print(body)
    title=list1[num].get('alt')
    #print(title)
    news_data.append([title,body,link])

    return news_data

ついでに、今まで夜 8:00に動かしてたんですが朝の方がなにかとバグとかに気づくし、その気になれば自分で手修正したりとかもできるので、朝8:00 に1回だけ動くように変更しました。

from apscheduler.schedulers.blocking import BlockingScheduler
import os

sched = BlockingScheduler()

#@sched.scheduled_job('interval', minutes=720)
#def timed_job():
#       os.system("python hatenapost2.py")
#       os.system("python hatenapost.py")

@sched.scheduled_job('cron', hour=8)
def scheduled_job():
        os.system("python hatenapost1.py")
        os.system("python hatenapost2.py")
        os.system("python hatenapost3.py")
        os.system("python hatenapost4.py")

sched.start()

数回テストしただけで同じ記事が2回出てきたのでダメかもしれないけど、まあいいや。。大したことない処理を簡単に直そうとおもっただけなのに案外時間がかかった。 自動投稿はバグ対応以外は一旦やめて他のことをやろう。。。

そしてこっちは仕様のミス(というか考えが足らなかった)

昨日新しく作った、

kyouno-ryouri.hatenadiary.jp

のページですが、今日もきちんと動きました。。。が、記事が昨日と同じ。。アレ?とおもっってリンク元の記事見たら、そのページは人気順位を出しているので、1位が毎日必ず変わるわけじゃないのでした。。

ということで私が作った処理だと、1位が変わらない限り毎日同じ記事をリンクすることになるという。。。

まあリンク元の記事をよく読んでなかったからしょうがないですね(アホ)。 一応広告が昨日の広告と違う広告になってはいます(^^

まあ今日はだいぶお酒のんじゃったのでどう変更するか明日以降に考えます。。

【heroku】ビルド失敗。。。

なんか自動投稿されないと思ったら、herokuでビルドが失敗してた。。

ase.py", line 918, in _create_trigger
2018-09-08T16:18:19.665649+00:00 app[clock.1]: return self._create_plugin_instance('trigger', trigger, trigger_args)
2018-09-08T16:18:19.665654+00:00 app[clock.1]: File "/app/.heroku/python/lib/python3.6/site-packages/apscheduler/schedulers/base.py", line 903, in _create_plugin_instance
2018-09-08T16:18:19.666080+00:00 app[clock.1]: return plugin_cls(**constructor_kwargs)
2018-09-08T16:18:19.666108+00:00 app[clock.1]: TypeError: __init__() got an unexpected keyword argument 'hours'

新しく特定時間に1回だけ実行する処理の設定を、hours とか書いてたけど sはいらなかったようだ。。。

きちんと heroku logs で確認しないとだめだな。

from apscheduler.schedulers.blocking import BlockingScheduler
import os

sched = BlockingScheduler()

#間隔は1分ごとにしています
#minutesではなくてhourに変更したら、時間での指定も可能です
@sched.scheduled_job('interval', minutes=720)
def timed_job():
        os.system("python hatenapost2.py")
        os.system("python hatenapost.py")

@sched.scheduled_job('cron', hour=20)
def scheduled_job():
        os.system("python hatenapost3.py")

sched.start()

hours を hour に直してデプロイしなおして、今度はうまくいったようだ。。。明日実際動くのを確認する。

2018-09-08T17:08:27.000000+00:00 app[api]: Build started by user asa418@nifty.com
2018-09-08T17:08:42.747312+00:00 app[api]: Release v14 created by user asa418@nifty.com
2018-09-08T17:08:42.747312+00:00 app[api]: Deploy 2b8f66ef by user asa418@nifty.com
2018-09-08T17:08:43.234843+00:00 heroku[clock.1]: State changed from crashed to starting
2018-09-08T17:08:48.281287+00:00 heroku[clock.1]: Starting process with command `python timeclock.py`
2018-09-08T17:08:48.918123+00:00 heroku[clock.1]: State changed from starting to up
2018-09-08T17:08:51.000000+00:00 app[api]: Build succeeded

少しはマシな自動作成サイトを・・・(^^)

画像(リンクでよい)も入った、ちょっとはマシな自動記事投稿をやってみるべー。と思ってやってみた。色々面倒くさいところはあったけど、まあそれなりにできた。

kyouno-ryouri.hatenadiary.jp

1日1回更新はうまく動くかわからないけど、見た目マシなのでとりあえずは満足。

まあ、だけどもやっぱり簡単に自動でやれる限界も感じつつある。まあ日々色々やってたら徐々に良くなっていく。。。かもしれない。