📊

Kaggle初心者が心折れずにメダルを目指すためのAIアプリ

2024/03/24に公開

はじめに

AIの学習を始めてKaggleの存在を知りました。
Kaggleでは、提供されるデータを使い、分析技術を競うコンペティションが開催されていて、データサイエンスや機械学習のスキルを磨ける場の一つです。

まず初心者が最初の一歩として取り組むコンペとして「タイタニック号の生存予測」があります。このコンペでは、Tutorialに沿ってデータの前処理や使用するモデルを変更していき、徐々に評価結果が良くなっていく(順位が上がる!)という経験ができ、とても面白いと感じました。

次に取り組んだのは「住宅価格予測のコンペ」。今まで学んだものを活かして自分自身で考えて取り組むということで、模範解答などは見ずに挑戦してみましたが、最初の数分は概要もデータ内容もわからず途方に暮れることに…。概要理解するところに時間は相当かかり、なんとか分析して提出しました。

ーこれでは次のコンペに取り組む一歩が出ない、これはまずい…ー

そう思った私は、今後も継続的にKaggleに取り組むには、概要理解するハードルを少しでも下げる必要があると強く感じたことから、この「Kaggle初心者が心折れずにメダルを目指すためのAIアプリ」を作ることにしました。

解決したい課題

下記4つの課題について1つのアプリで解決することを目指しました。

1.コンペの概要を理解するのに時間がかかる

2.多種多様なテーマとなっており、予備知識等も全く知らないものもある

3.データの前処理をするための理解に時間がかかる

4.使用すべきモデルを検討するのに知識がなさすぎる

アプリ機能

1.KaggleコンペのURLを入力すると概要説明してくれる
 ※Kaggleはすべて英語のため、日本語で要約したものを表示してくれる

2.そのドメイン知識について要約と参考サイトURLを教えてくれる

3.データの前処理の参考情報を教えてくれる

4.モデルの候補をいくつか挙げてくれる
 ※解説付き、もしくは参考サイトURLを教えてくれる

実行環境

パソコン:Surface laptop
開発環境:VScode
言語:Python 3.8.10
ライブラリ:Streamlit 1.31.1, LangChain 0.1.7, OpenAI 1.12.0, selenium 4.18.1, webdriver-manager 4.0.1

環境準備

export OPENAI_API_KEY="xxx"
pip install langchain streamlit openai
pip install selenium
pip install webdriver-manager

実装したコード

import streamlit as st
from streamlit_chat import message
from langchain.chat_models import ChatOpenAI
from langchain.schema import (SystemMessage, HumanMessage, AIMessage)
from langchain.callbacks import get_openai_callback
from urllib.parse import urlparse
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By

def init_page():
    st.set_page_config(
        page_title="Kaggleコンペティション分析ツール",
        page_icon="💡"
    )
    st.header("Kaggleコンペティション分析ツール 💡")
    # サイドバーのタイトルを表示
    st.sidebar.title("Options")

def init_messages():
    # サイドバーにボタンを設置
    clear_button = st.sidebar.button("Clear Conversation", key="clear")
    # チャット履歴の初期化
    if clear_button or "messages" not in st.session_state:
        st.session_state.messages = [
            SystemMessage(content="You are a helpful assistant.")          
        ]
        st.session_state.costs = []

def select_model():
    # サイドバーにオプションボタンを設置
    model = st.sidebar.radio("Choose a model:", ("GPT-4", "GPT-3.5"))
    if model == "GPT-4":
        model_name = "gpt-4"
    else:
        model_name = "gpt-3.5-turbo"
    
    return ChatOpenAI(temperature=0, model_name=model_name)

def get_url_input():
    url = st.text_input("KaggleのURLを入力してください。コンペについて概要説明します。", key="input")
    return url

def validate_url(url):
    try:
        result = urlparse(url)
        return all([result.scheme, result.netloc])
    except ValueError:
        return False

def get_content(url):
    try:
        with st.spinner("Fetching Content ..."):
            driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
            driver.get(url)
            content = driver.find_element(By.ID, "site-content").text
            driver.quit()
            return content
    except:
        st.write('something wrong')
        return None
    
def summary_prompt(content, n_chars=2000):
    return f"""以下英文はKaggleのコンペティションの説明文です。
    まず、英文のOverviewという単語以降で、DescriptionやEvaluationなどコンペに関する重要な内容のみを英文で抽出してください。
    次に、その抽出した英文について、DescriptionやEvaluationなどを日本語訳してください。また、データ分析を行う上で必要なドメイン知識の情報を{n_chars}程度で高校生にわかるレベルで説明してください。参考WebサイトのURLも3~5つリストアップしてください。機械学習とKaggleの参考Webサイトは不要です。
    さらに、モデル候補についても2~3つ挙げて、各モデルについて説明してください。
    最後に、以下の英文から英検2級、英検準1級、英検1級程度の英単語や熟語を最大30個リストアップして、[英単語:日本語の意味]を表示してください。
========

{content}

========
日本語でお願いします。
出力する際に、指示した内容を冒頭に表示する必要はありません。説明から始めてください。
    """

def get_answer(llm, messages):
    answer = llm(messages)
    return answer.content


def main():
    init_page()

    llm = select_model()
    init_messages()
    
    container = st.container()
    response_container = st.container()

    with container:
        url = get_url_input()
        is_valid_url = validate_url(url)
        if not is_valid_url:
            st.write('Please input valid url')
            answer = None
        else:
            content = get_content(url)
            if content:
                prompt = summary_prompt(content)
                st.session_state.messages.append(HumanMessage(content=prompt))
                with st.spinner("ChatGPT is typing ..."):
                    answer = get_answer(llm, st.session_state.messages)
            else:
                answer = None
    
    if answer:
        with response_container:
            st.markdown("### コンペ概要説明")
            st.write(answer)

if __name__== '__main__':
    main()


アプリの動き

-アプリを立ち上げた時の画面

-Kaggleの概要をコピペして入力

-取得中

-回答作成中

-回答結果


実装できた機能とできなかった機能

KaggleのURLを入れると、概要やドメイン知識、モデル候補について教えてくれる機能は実装できましたが、データ前処理の参考情報を教えてくれる機能はできませんでした。

KaggleAPIを使用して、実際のデータファイルをAPI経由でダウンロードするようにしてみましたが、エラーが出ており、現時点では解決方法はまだ見つかっていないので、引き続き試行錯誤していきたいと思います!

※おまけ:Kaggleのページを英語のままで読めるようになるために、入力した英文の中から英検2級以上のレベルの単語をまとめてリストアップしてもらうようなプロンプトも追加してみました。

まとめ

プログラミングスクールの最終課題として取り組んだこのAIアプリ開発。
テーマを決めるところから難航しましたが、なんとか卒業までに最低限の形にすることができました。

一番難しかったのは、KaggleURLを入力してコンペの概要情報をテキストを取得するところ。
何回トライしても「申し訳ございません。私はそのページの内容を直接見ることができませんでした。」という回答であきらめかけていたのですが、スクールのインストラクターさんにselenium というWebブラウザを自動操作できるライブラリを教えていただき、動的に生成されたテキスト部分の取得を実装できました。

プログラミング歴6か月(Kaggle歴1か月)のプログラミング初心者ですが、実際にこのアプリを使用しながらKaggleでコンペに挑戦し、いつかはメダルを獲得できるように学びを継続していきたいと思います!

参考にしたサイト

・つくりながら学ぶ!AIアプリ開発入門 - LangChain & Streamlit による ChatGPT API 徹底活用
https://zenn.dev/ml_bear/books/d1f060a3f166a5/viewer/f11592

Discussion