かえるのプログラミングブログ

プログラミングでつまずいたところとその解決策などを書いていきます。

kaggle のGPU環境で作成した CSVファイルの出力先はどこ? 2018/9/8

かえるるる(@kaeru_nantoka)です。
今回はいろいろあって kaggle のkernels で利用できるJupyter Notebook( 以下kaggle環境) でkaggle に取り組んでいた時に勝手が分からなくてつまづきました。

日本語のブログやqiita記事だと「kaggleのkernels で取り組んでGPU環境を無料で利用しよう!」までは書かれていたものの、「その環境で作成したものの出力先の場所はどこか?」やどうやって提出すればいいのかまで解説しているものがなかったです。

と言うわけで、今までローカルの Jupiter Notebook でkaggle に取り組んでいたけれど、GPU使いたくてkaggle環境でチャレンジしたい! と思っていた数日前の自分に向けて書いていきます。

**目次**

1:ローカル環境ではどうなの?

2:kaggle 環境だとどうだったの?

3:結局どうやったの?

4:まとめ

*******


1:

ローカル環境だと、

sub.to_csv( 'sub.csv' )

というようなスクリプトを実行すると、JupyterNotebook が実際に動作しているディレクトリ上に
sub.csv と言う名前で提出用のファイルが作成されます。

このファイルを、
kaggle のCompetition ページの Submit Predictions というところから先のファイルを探し出して提出します。



2:

そんな私は、
kaggle 環境でも、同じように

sub.to_csv( 'sub.csv' )

というスクリプトを実行しました。

しかし、、、

csvファイルが無い。。。

とても困りました。


3:

ー小目次ー
i ポイントとなるボタン

ii Commit を押して、notebook のページに移動しよう

iii output タブを押す

ーーーーー

kaggle 上で notebook を立ち上げると上の方に、

<< のボタンと、 Commit というボタン

があるのがわかると思います。今回のポイントはこのボタンたちです!

通常通り、
sub.to_csv( 'sub.csv' )

まで記述したら、このスクリプトを実行する代わりに先の Commit ボタンを押して実行します。

(私は、このボタンを押したら kaggle の諸先輩がたのように他のkaggler たちの目に触れるようになるのではないかとビビっていたのですが、デフォルトだと private 形式なようで Commit され他の方の目に触れる心配はなかったです。😄)

すると、 notebook 上で実行スクリプトが流れるので流れ終わったら、
先の << ボタンを押します。

すると、先に Commit した notebook のページ? のようなところに遷移します。

ここまできたらあと少し、このページに output のタブがあると思います。
これを押すと、先ほど作成した、csv ファイルや notebook 上で組んだ model などが保存されているはずです。

このcsv ファイルをクリックすると、Submit to Competition というボタンがありこれを押すと
無事提出できます!!


4:

kaggle のページのスクショとか勝手に使っていいものかわからず、テキストのみでの紹介になってしまいましたが、
これが kaggleにチャレンジしているどなたかのお役に立てると幸いです。

ありがとうございました!

kaggle 初心者 vs データの全貌

かえるるる(@kaeru_nantoka)です。

今回は、kaggle歴 2週間の初心者である私が知らずに苦労した点とその解決策を備忘がてら書いていきます。

データの参照についてです。

 

*******

1. はじめに

2. つまづき

3. 更なる問題

4. 今回の解決法

5. まとめ

*******

 

1:はじめに

本題に入る前にお伝えしておかないといけないのが、kaggle のコンペで自分の学習モデルを提出するまでのプロセスです。

私の現在時点の認識ですが、

 

( i )データをDLし、読み込む

→ ( i i )  欠損データを代わりのもので置換する

→ ( i i i ) 文字データを数値で置き換える or 数値で表せるような新たな特徴量に定義し直す

→ ( i v ) 機械学習モデルに学習させる

→ ( v ) モデルを提出する

 

という大きく分けて 5つのプロセスを踏みます。

特に ( i i ), ( i i i ) を前処理といってこれだけで膨大な時間がかかります。

 

この辺りの方法はカーネルを見たり、「kaggle 初心者」 とググったらタイタニック問題を題材に強い方々がわかりやすく説明してくれているので、そちらを参照すると良いでしょう。

 

2:つまづき

初心者である私は、まず強い方々がわかりやすく解説してくださっている日本語のブログなどを写経していました。

 

f:id:kaeru_nantoka_py:20180823000922p:plain

 

これはカーネルや日本語の解説記事などでまず書かれていないといっては過言ではない、お決まり文句です。

 

kaggle では、分析に必要なデータを csv という形式で配っているのですが、それをそれぞれ train, test という変数に格納し、head( ) というメソッドではじめの 5行を表示しています。

 

初心者の私はここでつまづきました!(早い!)

なんでデータのカケラしか見えないんや。。。

 

もともと私は要領が良い方でなく、全てのデータを見ないといちいち何の処理をしているのかが理解できませんでした。

 

また前処理 ( i i ), ( i i i ) で欠損値や数値置換をする必要もあるので、やはりどこに何があるのかを把握しておきたいものです。

 

そこで私は、

「 pandas データ 全部見る」といった具合でググってついに見つけました。

https://qiita.com/tanemaki/items/2ed05e258ef4c9e6caac

 

f:id:kaeru_nantoka_py:20180823002624p:plain

 

グラフのバーが小さくなったのがわかります。

これでこのタイタニック問題の全データが見れるようになりました!

 

3:更なる問題

しかし、この方法にもことkaggle においては重大な問題があります。タイタニック問題は、せいぜい 900行*12列 でしたが、他のコンペでは 30万行など膨大な量のデータがあります。

 

そうです 30万行です(苦笑)

表示しても全部見るのは大変ですし、そもそもMacBook Air くらいのスペックのPCだと読み込むのにだいぶ時間がかかって作業に支障をきたします。

 

4:今回の解決策

結局、私は以下の方法にたどり着きました。

任意の 行*列 を抜き出す方法です。

 

f:id:kaeru_nantoka_py:20180823004117p:plain

 

[ 行 , 列 ] で 2~5 * 2~5 のブロックを抜き出すことができました。これで抜き出す範囲をうまく調整することで、任意の場所を参照できます。

 

5:まとめ

kaggleに参加してみたい初心者がぶつかりそうなこととその解決方法を、初心者の私がその時のシチュエーションそのままにお送りしてきました。

また何か、つまづきや気づきがあったら記録します。

 

ありがとうございました。

機械学習初心者な私がkaggleをオススメする3つの理由。 2018/8/19

かえるるる(@kaeru_nantoka)です。
今回は、私が最近ハマっているkaggle(カグル)についてオススメな点を機械学習初心者の目線で書いていこうと思います!

1. kaggleとは?
2. 理由1 ー 豊富なカーネル
3. 理由2 ー 目標と現在地点の距離が明確
4. 理由3 ー 自分に足りないスキルが明確にわかる
5. まとめ


1. kaggleとは?

みなさんkaggle(https://www.kaggle.com)はご存知でしょうか。
wikipedia(Kaggle - Wikipedia)によると、

***************************************
Kaggleは企業や研究者がデータを投稿し、世界中の統計家やデータ分析家がその最適モデルを競い合う、予測モデリング及び分析手法関連プラットフォーム及びその運営会社である。
***************************************

ということです。機械学習をテキストなどで勉強された方が一度は感じたことがあるであろう「こんなにたくさんのデータを1から集めるなんて大変だなあ」といった機械学習あるあるに悩まされることなく機械学習の勉強をすることができます。

また、企業や研究者はデータを提供しているだけではなく、ランキングの上位のモデルを提出した個人/グループには賞金を出しているところもあります!


2. 豊富なカーネル

先ほど、kaggleは機械学習モデルの精度を競うプラットフォームであると見てきました。なんと上位ランカーの投稿したモデルを作るプロセスを見ることができるのです!

それがカーネルです。カーネルとはkaggle上で閲覧・実行ができるjupyter notebook です。
ズバリ一流のデータサイエンティストの手法が見放題なのです!😳

私の場合、知人にデータサイエンスに精通している方がいないので書籍やネットを介してではないとこうした知見を得ることができません。
一方カーネルは、機械学習初学者向けにとても丁寧に書かれたものもあります。

高度な処理を実施していたり、その処理をしている理由を前後の文脈から読み取らなければならない難しさはありますが、これも勉強なので私としては大満足です!


3. 目標と現在地点の距離が明確

f:id:kaeru_nantoka_py:20180820001426p:plain

これは私が最初に投稿したときのものです。
このように、自分が組んだモデルの精度が点数化され、その母数の中の順位が表示されます。
自分の中に蓄積された知識をフル動員して、0.01点の変化を追うプロセスがアツいです!

またプログラミング学習あるあるである、自分の実力が客観的にどれくらいなのかが見えない問題もこのkaggleでは起こらないです。

今の自分のベストを数値という絶対的な指標でみれる、とても魅力的なフィールドです。

4. 自分に足りないスキルが明確にわかる

kaggleにはタイタニック問題(Titanic: Machine Learning from Disaster | Kaggle)という初学者向けのチュートリアルの位置付けの問題があります。

・日本語で丁寧に解説されているものがある
・この手法を応用することで他の問題を解くこともできる

と初心者でも取っつきやすい上、良いことづくめな問題です。

つまり、この問題を写経してみて内容が理解できないということは機械学習をする上での基礎が抜け落ちているということになります。
私の場合は、この時点で numpy や pandas といった機械学習ライブラリの理解不足が浮き彫りになったので、Aidemy のデータクレンジングコースで基礎を抑えた上で再挑戦したらすんなり内容が入ってきました。

このように、チュートリアルカーネルを読み進めていく中でわからないところを他の教材で詰めていく、といったようにアウトプットを前提にしているので無駄なくデータ分析の知識をインプットができます。


5.まとめ

私もkaggle歴はまだ浅いですが、以上の理由でモチベーション高く・日々コツコツ着実に機械学習の勉強を進めていることができています。
pythonを学習しているみなさんもぜひkaggleに参加してみてください!

ありがとうございました。

[つづき]chart.js + Flask で円グラフをWEB上に表示する。 2018/8/5

かえるるるです。

 

先ほどのエントリが途中で切れていたので、続きを投稿します。。

 

 

kaeru-nantoka.hatenablog.com

 

この記事の最後、ポイントは。。。

の続きから書いていきます。

 

ポイントは、html の下の方にある

<script src = ~~~/Chart.min.js></script>

です。これのおかげで、chart.jsをサイトからダウンロードしなくても使えるようになります!

 

2:結局何ができるようになるの?

 

=> ユーザーに入力してもらった値を用いてpython機械学習ライブラリで計算、その結果をWEBページに表示することができるようになります。

 

機械学習を個別の環境で扱う方法に jupyter notebook というものを使う方法があります。

この環境でグラフを表示する方法は主に以下の2つがあって、

i. show() 関数を使う。

ii. jupyter notebook 環境のブラウザを使う。

 

これらは環境に依存する(環境構築をしたPCでのみできる)ため、webサービスに転化するのが難しいです。

しかしこの方法なら、webサービスとして公開できます。

 

3:参考URL

 

今回は以下のサイトたちを参考にいたしました。

FlaskとTwitter APIで、ツイッターのソーシャル分析アプリを作りました

グラフ作成にオススメ!「Chart.js」がかんたんに使えてイイ感じ | vdeep

[Python] Flask 入門 - ゾンビでもわかるPythonプログラミング

 

以上です、今回も足を運んでいただきありがとうございました。

chart.js + Flask で円グラフをWEB上に表示する。 2018/8/5

かえるるる(@kaeru_nantoka)です。

今回は, Flask + chart.js で円グラフを20分でWEB上に表示することができたので備忘としてまとめておきます。


*目次

1:コードと解説

2:何ができるようになるの?

3:参考URL



*内容

1:さっそくコードです。今回のディレクトリ構成は以下の通りです。

FlaskProject/server.py
/templates/index.html

#server.py

from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')

def index():
    return render_template('index.html')

if __name__ == "__main__":
    app.debug = True
    app.run(host='0.0.0.0', port=7777)

はい、たったこれだけ(8行)で localhost:7777 に index.htmlを表示することができます。
びっくりですね!

同じPythonフレームワークDjangoでいうと、

3行目・・・urls.py
4~5行目・・・views.py
6~8行目・・・setting.py

の役目をそれぞれ担当しており、それらが1ページにまとまっているという構成になっています。
ちなみに、render_template()はtemplatesフォルダに置いてあるhtmlファイルを表示してくれます。

* /templates/index.html

<!-- index.html -->
<!DOCTYPE html>
<html lang="ja">
  <head>
    <title>Chart.js + flask</title>
    <meta charset="UTF-8">
  </head>
  <body>

    <h1>Chart.js + flask</h1>

    <div style="width: 50%">
      <canvas id="pie-chart" height="300" width="450"></canvas>
    </div>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/1.0.2/Chart.min.js"></script>

   <script>

      //http://vdeep.net/chart-js 参照

                var pieData = [
          {
            value: 37,
            color:"#9acce3",
            highlight: "#aadbf2",
            label: "現預金"
          },
          {
            value: 25,
            color: "#70b062",
            highlight: "#7fc170",
            label: "国内債券"
          },
          {
            value: 17,
            color: "#dbdf19",
            highlight: "#ecef23",
            label: "国内株式"
          },
          {
            value: 10,
            color: "#a979ad",
            highlight: "#bb8ebf",
            label: "外国債券"
          },
          {
            value: 8,
            color: "#cd5638",
            highlight: "#e2694a",
            label: "外国株式"
          },
          {
            value: 3,
            color: "#cd56ab",
            highlight: "#e269df",
            label: "REIT"
          }


          ];

          window.onload = function(){
          var ctx = document.getElementById("pie-chart").getContext("2d");
          window.myPie = new Chart(ctx).Pie(pieData);
          };
    </script>
  </body>
</html>

今回は個人の保有資産データを視覚化してみました。
以下の写真のような表示になります。


f:id:kaeru_nantoka_py:20180805013750p:plain

ポイントは、

広告を非表示にする

Python Django で iTunes API を 簡単に叩く。 2018/7/31

かえるるる(@kaeru_nantoka)です。



本エントリでは、Django プロジェクト内にて PythoniTunes API を叩き楽曲情報のJSONデータをhtml上に表示します。

この時検索条件を指定するのですが、この時に渡すデータをDjango model から持ってくることとします。



尚、今回は↓ の方のエントリを参考にさせて頂きました。
iTunes APIの分かりやすい使い方解説 – ハックマン.com


jsのajaxを使用してわかりやすく説明してくださっています。ありがとうございました。



目次:

1- 主なプロジェクト構成

2- 今回触るファイル

3- ソースコード

4- まとめ


実践 :

1- プロジェクト構成


myProject/myApp --- 曲情報を格納しているアプリ

myProject/myAPI ---  APIを叩いてhtmlレンダリングするアプリ


2- 今回触るファイル


myApp/model.py

myAPI/views.py, myAPI/urls.py


3- ソースコード

i.

    
   #myApp/model.py
   from django.db import models

class Singer(models.Model):

    singer_name = models.CharField(max_length=50)
 
    def __str__(self):
        return self.singer_name 

Singerクラスというものを定めています。

localhost/adminの管理画面か、shellスクリプトで歌手名を登録しておきましょう。
今回は、「米津玄師」「Perfume」を登録しておきました。

__str__() という関数はありますね。これは、歌手名を String データに変換して返す関数です。
Djangoモデルでは「クエリ」という形式でデータを格納しています。
それを扱いやすくするために、Stringという形式に変換するのがこの関数の役目です。


ii.

    
   #myAPI/views.py

   import json
from django.http import HttpResponse
import requests

from myApps.models import Singer

def render_json_response(request, data, status=None):
    #response を JSON で返却
    json_str = json.dumps(data, ensure_ascii=False, indent=2)
    callback = request.GET.get('callback')
    if not callback:
        callback = request.POST.get('callback')  # POSTでJSONPの場合
    if callback:
        json_str = "%s(%s)" % (callback, json_str)
        response = HttpResponse(json_str, content_type='application/javascript; charset=UTF-8', status=status)
    else:
        response = HttpResponse(json_str, content_type='application/json; charset=UTF-8', status=status)
    return response

def iTunes_search(request):

    item_data = Singer.objects.all()

    lz = []
    data_list = []

    sss = 0
    maxNum = "5"

    for x in item_data:
        z = x.__str__()
        lz.append(z)
        keyWord = lz[sss]
        print(lz[sss])

        url = 'https://itunes.apple.com/search?lang=ja&entry=music&media=music&country=JP&limit='+ maxNum +'&term=' + keyWord

        headers = {"content-type": "application/json"}
        r = requests.get(url, headers=headers)
        data = r.json()
        data_list.append(data)
        print(data_list)

        sss += 1

    return render_json_response(request, data_list) #JSON 

・本エントリの本命の、iTunes_search()関数です。
・item_data = Singer.objects.all() はSingerという名前でDBに格納されているもの全てをクエリという形式で取得します。今回は、「米津玄師」「Perfume」という値がやってきます。
・lz と data_list という配列を用意します。クエリできた値を__str__()で文字列に変換し、配列 lz にしまいます。
・lz にしまったそれぞれの値を KeyWord として urlに渡し、そのurl でAPIを叩きその返り値のJSONデータを data_list[]に格納。
・歌手の人数分これを繰り返し、最後にまとめてJSONオブジェクトとしてHTMLに投げるといった具合です。

iii.

    
    #myAPI/urls.py

    from django.urls import path
from api import views

app_name = 'api'
urlpatterns = [

    path('iTunes_search/', views.iTunes_search, name='iTunes_search'),
]

ここでは、myAPI/views.py で投げられたJSONオブジェクトを表示するためのurl を作っています。

localhost/myAPI/iTunes_seach/ で検索したら先ほど投げたJSONデータが表示されます。

f:id:kaeru_nantoka_py:20180731014329p:plain

私の場合はこのようになりました。
下にスクロールしていったらPerfumeの曲も5曲出ています。


4- まとめ
このように簡単に iTunes APIを叩いて楽曲情報を取得することができました。

youTube APIと異なり認証キーを必要としないのは魅力的ですね。

以上、ありがとうございました。

Django model の データを JSON化して利用する。 2018/07/26

かえるるる(@kaeru_nantoka)です。

 

本エントリでは、前回記事で書いたAPIを叩くときの検索ワードとして、データベースに登録したものを使用できるようになることを目指します。

 

本記事では前記事でも扱ったproject, app に加えて

song というアプリを同じプロジェクト内に作成して進めることとします。

 

project : myTutorial

app : myTutorial/api

         myTutorial/song


kaeru-nantoka.hatenablog.com

・目次

 1:準備

 2:実践

3:おまけ

4:参考にした記事

 

1:準備

まず、今回扱うモデルとデータは以下の通りです。

# song/models.py

from django.db import models

class Song(models.Model):
    song_name = models.CharField(max_length=50)

    def __str__(self):
        return self.song_name

    # Djangoモデル のデータを返す関数
    def to_dict(self):
        return self.song_name

DBにはadmin画面から入れておきます。
今回は、 

Lemon (米津玄師) ultrasoul(B'z)

の2曲を入れています。


次に、取得したデータをウェブ上に表示する準備をします。

#api/urls.py

from django.urls import path
from api import views

app_name = 'api'
urlpatterns = [

    path('hoge/bring_mdl_data/', views.bring_mdl_data, name='bring_mdl_data')
]
#myTutorial/urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('song/', include('song.urls')),
    path('admin/', admin.site.urls),
    path('api/', include('api.urls')), 
]


2:実践

#api/views.py 

import json
from django.http import HttpResponse
import requests

from song.models import Song

#pythonでJSONファイルを返す時に記述

def render_json_response(request, data, status=None):
    #response を JSON で返却
    json_str = json.dumps(data, ensure_ascii=False, indent=2)
    callback = request.GET.get('callback')
    if not callback:
        callback = request.POST.get('callback')  # POSTでJSONPの場合
    if callback:
        json_str = "%s(%s)" % (callback, json_str)
        response = HttpResponse(json_str, content_type='application/javascript; charset=UTF-8', status=status)
    else:
        response = HttpResponse(json_str, content_type='application/json; charset=UTF-8', status=status)
    return response

def bring_mdl_data(request, song_name=None):

    #クエリセットという形式で登録されている曲を全て持ってくる
    items = Song.objects.all() 

    k = json.dumps([ items[0].to_dict() ])
    # items[0] に格納されている Lemon がJSON形式に変換されて k に代入される

    return render_json_response(request, k)
    # JSON形式の k をウェブ上に表示する。 

127.0.0.1:8000/song/hoge/bring_mdl_data/

に "[\"Lemon\"]"

が表れたら成功です!!


3:おまけ

こうしてDjango model よりWebページ上に引っ張ってきたデータは
フロントのJSで fetch( ' 127.0.0.1:8000/song/hoge/bring_mdl_data/ ' )
でアクセスできます!
(ちなみに console.log( 返り値 ) で Lemon が表示されます。)


4:参考記事

↓こちらの方の記事を参考にしました。ありがとうございました!

DjangoでJSONを使うための一考察 SQLの最適化など - グロブ


以上です!