Python
初心者
機械学習
MachineLearning
PyQt5

ビギナーが機械学習のGUIアプリ化ってホントにできるの?

ビギナー(IT本格参入2年目)の私が機械学習を行うGUIアプリを作成してみるにあたり執筆する記事です。
バグや設計上の不備、その他もろもろのご指導・ご指摘・ご質問随時受付中です。

始めにソースコードを晒します。⇒ 晒しモノ
進捗: 予測系まで完了(2017/12/30)

執筆目的

  • ビギナー臭の香ばしい、数年後に見返すと赤面必至のソースコードをあえて晒し、精神力を鍛える。

  • あわよくば問題点・改善点を指摘していただき、技術力向上に繋げる。

アプリ製作目的

経緯

「機械学習楽しいなぁ!KaggleTitanicは最高スコア0.76076、House Pricesは最高スコア0.16326(2017/12/3時点)のムシケラやけどまだまだ頑張るで!」
「ソースコード上で色んなスイッチとかパラメータ管理すんの大変になってきたなぁ…せや!勉強がてらその辺を楽にできるGUIアプリでも作ってみるか!」

目的

  • 各種練習

    • Python
    • PyQt5
    • オブジェクト指向プログラミング
    • 設計
    • github
  • 技術のアウトプット

  • Kaggle等を楽に実施

  • 備忘録

  • (転職で有利になるのかもしれない)

つまずきポイント

  • Python系

    • Pythonの「__」(アンダーバー2つのプレフィックス)はprivateを表す
      • 継承先からは使用不可
    • 子オブジェクトから親のオブジェクトのメンバ変数(データフレーム)にアクセスすると落ちる
      • ゲッターを使用すると問題なく取れる(原因不明)
    • 辞書型のアイテムは参照渡しではない
      • アイテムの値に登録した変数値を変更しても、辞書の当該アイテム値は変更せず
        • アイテムがイミュータブルだとアイテム値は変更されず、ミュータブルだと変更される
  • PyQt5系

    • UI表示系クラスの実装に際し、共通する描画処理を親クラスに書き差分だけを子クラスに書こうとしたが、レイアウト系処理(QVBoxLayoutのインスタンス化やself.setLayout()をどこでどう書けばいいのかなど)に悩んだ
      • レイアウトインスタンスを引数や戻り値でやり取りし実装した
    • setStyleSheet()で指定するスタイルの取り扱い
      • ex: 押下状態のボタンのスタイル変更はどうするのか
    • モードレスなダイアログを表示すると、表示された瞬間に消える
      • モードレスダイアログの親ウィジェットを指定していなかったため
        • なぜ親ウィジェットを指定しないとそうなるのかは不明(親を指定しないとウィンドウとして表示されるようだが…)
  • 機械学習系

    • AdaBoostClassifier()のアルゴリズムをalgorithm='SAMME'にしないと落ちたり、そもそもベースの推定器によってはアダブーストが使えなかったりする
      • 対処法はそのベース推定器を回避する?
  • 設計系

    • モジュールを疎結合に保つこと(未だ密結合多し?)
    • オブジェクト指向プログラミングのベストプラクティス(未だ完全にはつかめていない)
  • その他

    • PyCharm上ではプログラムを実行できるが、コマンドプロンプトからmain関数を実行するとModulenotFoundErrorが発生する(未だ解決せず)
      • 「sys.path.append("/xxxx/yyyy/")」を先頭に記述するという解答例があるが、解決せず
    • ステップ数が1000行を超えた辺りからスパゲッティがコク深になり始めた
      • 変数名の一貫性や整合性が取れなくなったり、不要なオブジェクトが発生したり

今後の実装予定

  • 学習実行中であることを伝えるダイアログ表示
  • データを学習実行に使える形に成形するプログラム
  • 書きだしたパラメータの読み込み処理
  • 前処理や分析手法、パラメータの追加
  • 分析手法やパラメータの説明
  • UIをより洗練されたものに
  • 最高スコア時にパラメータを自動保存

※随時更新していきます