*アーカイブ*
2022年度 ①頁目 ②頁目 ③頁目

       

*①頁目 目次*
 49. GUIでアプリ作成②/ 
50. GUIでアプリ作成②-2/  51.GUIでアプリ作成③ / 52.後日譚 / 53.特別編 /
 54.最近の取り組みとデータ補正 / 55.データの補正方法 / 56.ライブラリ編2-① / 57.雑談編⑦ /
 58.ライブラリ編2-②

         


【第49回】 pySimpleGUIを使ったアプリケーション作成 #2-①

漫画49今回は前回の続き部分で、pySimpleGUIのウィンドウのレイアウトを
作成していきます♪
プログラム始めに記載しているsg.theme('Dark Blue 3')ですが、
テーマをダークブルー3に設定しています。
テーマ設定については公式ガイドを見てもらえばいいと思います。

pySimpleGUIのレイアウトですが、リストで管理されており行単位で
配置します。
例えばこんな配置したいとき…

画像01・レイアウト例

layout=[[テキスト,ボタン],[テキスト,ボタン,ボタン],[テキスト入力ボックス]]

このように、コンマ区切り「,」で区切ったウィジェットをリスト形式を
行ごとに並べて指定します。直感的にも分かりやすいですよね。
これを踏まえてひとまずコード全体を表示します。↓

画像02・後半GUI全コード


    全コードを実行すると以下のようなウィンドウが表示されます。

画像03・ウィンドウ

さて、コードの説明ですが、

画像04・def関数

まず関数(def)
Timeseries_func(): input_func(): save_func():
 はウィジェットのボタンをクリックしたり、
入力があった場合にどういった処理を行うかを指定しています。
つまり、ウィンドウでファイル選択やチェックマーク、plotをクリックしたときに何をするかを
これらの関数で指示しているんですね!

valuesに関しては後に説明していますが、ウィジェットの値を格納している辞書です。
window[key].updateは、()の中にオプションやテキストを入力する事で
keyで指定したウィジェットに対して変更を行えます。

その下の、35行目

画像05・handler

これは、後に説明を入れますが条件分岐を分かりやすくするための書き方です。
イベントループで受け取ったイベントから、どの関数を走らせるか対応付けを行っています。

画像06・レイアウト

次にウィンドウの見た目設定をlayoutで行っています。
各ウィジェットについて簡単に説明すると

Text:ウィンドウにテキストが配置できます
FileBrowse:ボタン設置(クリックするとダイアログでファイル選択を行います)
InputText:テキスト入力可能なボックスの配置
Checkbox:チェックボックスの設置
utton:ボタンウィジェットの設置



オプション設定ですが、
padは((左,右),(上,下))の余白設定。
sizeは(幅,高さ)でウィジェットの大きさを変更できます。
keyはウィジェットに入力があったときにkeyで指定したテキストでイベントを受け取ります。

(調べているとkeyに直接関数を設定してもいいみたいな記事も見つけましたが、
分岐が多いと後から変更するのが大変なので私はhandlerで一まとめにしています(;´Д`))

enable_eventsTrue/False
ウィジェットへの変更(クリック)をイベントとして扱うかどうかを設定できます。

分かりやすいのはチェックボックスで、チェックを付けたり外したりするたびにイベントが発生します。
関数save_func()にクリックしたときのイベントを記載しているので参考にしてくださいな。


disable=True(False) これをTrueにしていると、ウィジェットを無効化できます。
上のウィンドウのplotボタンなんかは、このオプションの設定をしているため
ボタンが押せない状態になっています。

また、FilesBrowseは他のウィジェットにはないtargetというオプションがありますが、
長くなるのでこれについてはまた次回にします♪ではまた!!

***㊿へ続く***   このページ最初に戻るこのページ最初に戻る ヘビカノTOPに戻るヘビカノTOPに戻る 環境システムTOPに戻る

0701**20220107


*CMタイム*


※詳細&諸条件はサイトへGo!



【第50回】 pySimpleGUIを使ったアプリケーション作成 #2-②

漫画50皆さんこんにちは♪

今日は前回の続きで、sg.FilesBrowseの動作とオプションから
お話していこうと思います。


1.紐付ける

画像06・レイアウト

sg.FilesBrowse特にオプション設定しなくても、
隣にsg.InputTextを置くだけで取得したパスを自動的にInputText
表示
してくれます。

[sg.FilesBrowse(),sg.InputText()] ←こんな感じに(笑)

あくまでInputTextに表示するだけなので、
ウィンドウの外で取得したパスを参照したり、
実際に選択したファイルを開くことは出来ません。

そういう場合はtargetオプションで
FileBrowseの取得したパスとInputTextのキーを関連付けてから
enable_eventsTrueにしておくと、
バックグラウンドでファイル操作が可能になります
。↓
[sg.FilesBrowse(‘’,Key=’input',target='FLD'),sg.InputText('',key='FLD',enable_events=True)]

このオプションに設定によって、FileBrowseで選択したパスが隣のInputTextに自動的に入力されたとき、InputTextへの入力をイベント‘FLD’として認識させる仕組みです。
FileBrowse側のKey=’input’はあってもなくてもOKですが、
InputTextにenable_eventsが設定されている場合はvalues[‘input’]でパスを参照することが出来ます。



2.イベントとvaluesについて


先ほど作ったwindow(レイアウト)はwhile構文によってデスクトップに持続させます。
(while True:で永久に処理を繰り返し続ける)



この間ウィジェットへの入力は、event,values(イベントと値)として常に出力されます。
valuesは辞書形式で、ウィジェットに特定のkeyを指定してない場合、ウィジェットを配置した順に
数字の0から自動でキーが振られます。

辞書はあるキーに対応する値が格納されている形式で、
ここではイベント名(event)=キー(key)で、各ウィジェットの値(テキストなら文字列、
チェックボックスならTrue/Falseなど)が値(values)に相当します。
(詳しくはPython dict 辞書で調べてみてね)

values={’Key1’:値1, ‘Key2’:値2, … }
このとき、Key1の値を参照したい場合はvalues[‘Key1’]で値1が参照できます。
例としてFileBrowseウィジェットであれば(=以下ウィンドウ画像のファイル選択ボタンをクリックしたとき)、
event=‘FLD’、values[‘Input’] とvalues[‘FLD’]はどちらも選択したファイルのパスが出力されます。

画像03・ウィンドウ


また、イベントループ部分の
if event is None: とは、ウィンドウを□×ボタンで閉じた場合の処理です。
breakでwhileによるループを抜けてウィンドウを閉じることが出来ます。

ウィンドウを閉じたときのイベントはNoneになります。
イベントに対するその他の処理も全てwhile構文内に書き足していきます。
分岐や処理が多くなればなるほど69行目以降、どんどんif文と行数が増えていくので、
handlerですっきりまとめています。コードを見直すときも便利ですからね(^^)

以上でGUIの説明は終了です♪
次回はこれを実行ファイル(.exe)にしてみようと思います☆

     

***51へ続く***      このページ最初に戻るこのページ最初に戻る ヘビカノTOPに戻るヘビカノTOPに戻る 環境システムTOPに戻る

0701**20220121


*おまけ* ※CM漫画の4コマ目でもとちゃんが見ていた画面について。

     

【第51回】 pySimpleGUIでアプリ作成 #3ーPythonプログラムのアプリ化

漫画51皆さんこんにちは!
今回はPythonプログラムをデスクトップアプリ(.exe形式)に
変換する方法をご紹介します☆

私が試した結果、途中エラーが出てうまくいかない事も多々あったので、
そのエラー解消方法も含めた防備録です(*^_^*)
まず、前提ですが私の開発環境はAnacondaです。

エグゼ(.exe)化にはpyinstallerを使います。流れとしては、

1.AnacondaPromptで pip install pyinstaller して、
  ライブラリをインストール

2.AnacondaPrompt上で、cdコマンドを使って
  アプリ化したいファイルの場所に移動する

3.pyinstaller △△△.py --onefile –noconsole で
  △△△.pyを実行ファイルに変換

1.はインストールだけなので、2.から順に進めていきますね。

画像8・インストール画面

一応メモしておきますが、Conda環境がアクティブであれば、コマンドプロンプトを開くと
(base)が表示されます。これが入力受付可能な状態です。
アクティブになってない場合はこの後の処理が出来ないので気をつけてください。

(base) C:\Users\User\Documents> cd..

cdコマンドでディレクトリの移動ができます「..」で1つ前のディレクトリに戻ります。
“cdディレクトリ名“でエグゼ化したいファイルが存在するディレクトリまで移動します。
(↑画像では間違って階層が一つ浅いところでエグゼ化しているのですが、
下記エラーに紛れてしまって気づかなかった(笑))

移動できたら、pyinstaller exefile.py --onefile (--noconsole)でエグゼ化を行います…が!




The 'typing' package is an obsolete backport of a standard library package and is incompatible with PyInstaller.Please `conda remove typing` then try again. 
の文字が...。
どうやらTypingというライブラリは廃止されており、とpyinstallerの互換性が無いので、
「conda remove typring」
(Anacondaからtypringライブラリを消去)してから再度実行してください。

というメッセージらしい...。
そこで、気を取り直して言われたとおりtypringを消去しようとしたのですが

画像9

「パッケージが見つからない」と怒られました(笑)
そこでAnacondaのインストール済みパッケージ(site-packages)の確認をしてみると...

画像10・確認画面

再実行↓

画像11

やった!動いたー!!!(感動)

pyinstaller ファイル名(.py) --onefile --noconsole
--onefile は実行ファイルを1つにまとめるオプション(これは書いた方がいい)、
--noconsoleはアプリ起動時にコマンドプロンプトのコンソール画面を表示させないオプション設定です。
実行2回目以降はこのオプションも追加して試してます(笑)

これで実行ファイル完成した!!!と思った矢先、(画像には掲載しきれていませんが)最終行に
RuntimeError: No metadata path found for distribution 'greenlet'.
「配布用のメタデータパスが見つかりません」
なるエラーがでました(T-T)


このエラーについて調べると、
pip install --ignore-installed greenlet のコマンドで解決できるらしいので早速実行してから、
再度エグゼ化してみました↓

画像12""/
画像13

completed successfully!!…と、い・う・こ・と・は!

やっっっっっとできましたー(;.;)✨!!
コマンド実行後に、distフォルダーが追加されているので、その中に.exeファイルが在れば成功です♪

画像14

このexeファイルをダブルクリックすると、Pythonプログラムが実行されます☆

後日談ですが、この実行ファイルはデスクトップPCで作った物なので、
別のパソコンで開いたときにちゃんとプログラム実行されるのかどうか試してみたくなり、
手持ちのノートPCにzipファイルで送ってみたんですが…

結果、うまく動きませんでした(T_T)

なぜなのか原因が分かったらまた記事をアップしたいと思います(;´Д`)


では今日はここまで!

     

***52へ続く***      このページ最初に戻るこのページ最初に戻る ヘビカノTOPに戻るヘビカノTOPに戻る 環境システムTOPに戻る

0701**20220204


【第52回】 12の後日談(pyinstallerでexe化したファイルがノートPCで動かない問題について)

漫画52皆さんこんにちは!
ここ数回に渡ってpyinstallerを使ってプログラムをexe化する工程を
お話したと思います!

このときwin10Pro(64bit)でエグゼファイルを作成していたのですが、
作成したPC上ではちゃんと起動する事を確認出来ました!
なので、配布することを想定してもう1つ別のノートパソコン(32bit)でも
起動するか試してみたんですね!
するとどうでしょう…

“このアプリはお使いのPCでは実行できません”

とシステムに怒られました...(´・ω・`)
「なんで起動しないの!?」とショックを受けて、いろいろと調べるうちに
後で分かったことですが、そもそも64bit版のPythonで作ったアプリは32bitパソコンでは起動できないようです(°°;)

じゃあどうするのかと言うと、
これを改善するためには、仮想環境でPythonの32bit版をインストールする
とこから始めないといけない様子…。(←お使いのパソコンが32bitなら
しなくても大丈夫)

私はめんどくさいので64bitのパソコンから32bitのパソコンに
ランナーチェンジしてpyinstallerでエグゼ化を行いました。
これでやっと成功するかと思いきや、、コンソールに以下のようなエラーが…。

CondaVerificationError:
The     package     for     pyinstaller     located     at
C:\Users\HYDROLAB\Anaconda3\pkgs\pyinstaller-4.5.1-py36hc69ef3d_0
appears to be corrupted. The path
'Lib/site-packages/PyInstaller/bootloader/Windows-32bit/run.exe'
(↑このファイルが破損しているらしい…)
specified in the package manifest cannot be found.


先に詳細を説明しておくと、私が開発に使用しているPythonのバージョンは3.6で、
コマンドプロンプトからpip やcondaを使ってpyinstallerをインストールした際、
特にバージョン指定しなかったので暗黙的にpyinstaller-4.5.1のバージョンをインストールしていました。

こちらのバージョン、Python3.6の環境ならPyinstallerで一番安定していると言われるバージョンらしいですが……よくよくコンソールを見ていると32bit版のファイルの一部が破損しているようですね💧
そこで破損箇所をインストールし直そうと思いcondaの仮想環境※1から conda install pyinstaller を実行するとPC本体のウイルス検知ソフトに↑のrun.exeファイルが引っかかっていることが判明しました。
(;´Д`)マジかあああああ

この原因の一説には、“ウイルス作るときに高確率でpyinstallerが使用されているから“というコメントも
ありました…。(まあ確かにそうだよね)

これはもうどうしようもないのでウイルス検知ソフトのカスタマーセンターに直接問い合わせました(笑)
ソフト提供元によっても操作手順が変わりますが、
一度ウイルスとして誤認&除去されたファイルを検知対象から除外して復元することで、
このエラーは改善されるようです。
詳しくはお使いのウイルスセキュリティソフト提供元に問い合わせてみてください(;´Д`)
この問題がクリアできればエグゼ化は完成です♪♪


ちなみにですが、アプリを作る側だけでなく出来上がったアプリをzip形式でほかのPCに配布したときも、
送り先のPCのウイルス検知ソフトに配布したアプリ(.exe)が引っかかって実行できない場合もあるので、
先と同じ手順でウイルス検知から除外することを覚えておくといいかもしれませんね!!

ノートPCで起動しない問題について、
初めは出来上がったエグゼファイルが重すぎるのが原因かと思っていたので、
仮想環境についていろいろ勉強してみたんですが、まさかウイルス検知ソフトだったとは…
モトハシ、この度は呆気にとられました。
では次回もお楽しみに♪


※1 仮想環境について

pip やcondaでライブラリを沢山インストールしたPython環境を使用している場合、
そのままの状態でpyinstallerからプログラムのエグゼ化を行うと、その環境にインストールされている
全てのライブラリを含んだファイルを生成するようです。
配布用のスクリプト(プログラム)で使用していない余分なライブラリもパッキングされてしまうので
ファイルが肥大化するんですね💧
そこで、普段使っているベース環境とは別に、ライブラリが何も入っていない仮の環境(仮想環境)を作って、
そこに最低限のライブラリをインストールしてパッキングすることで軽量化されたエグゼファイルが
作成できます(^^)


     

***53へ続く***      このページ最初に戻るこのページ最初に戻る ヘビカノTOPに戻るヘビカノTOPに戻る 環境システムTOPに戻る

0701**20220218


【第53回】 特別編ー50回突破記念企画告知漫画


          


奮ってご参加ください!
〆切は8月31日(水)です。
   

     

***54へ続く***      このページ最初に戻るこのページ最初に戻る ヘビカノTOPに戻るヘビカノTOPに戻る 環境システムTOPに戻る

0701**20220218


【第54回】 最近の取り組みとデータ補正について

漫画54皆さんこんにちは(^^)
ここ最近はアプリ作成に没頭していたので、その防備録を数回に渡って
書かせて頂きました。
私にとってアプリ化は結構大きな区切りといいますか…、
Pythonを始めたと同じ時期、大学との共同研究で(ディープラーニングを含む)
商用ソフトの開発と学術的論文化を目標に、これまでの3年間私がデータの
解析や図化を行っている際に疑問に感じたことや、初心者目線での発見を
かいつまんで説明してきました。

ここで現在の状況について一度整理すると、
1. ディープラーニング(AI関連)については、水質自動昇降装置で取った
データのエラー値・欠測問題が解決すれば本格的に開発が進むのかな?
という状況です。

2. その他、データ整理や簡単な解析については随時行っています。

今後もこれらのテーマについて情報をお伝えしていくつもりです。
そして、1.については一部のエラーに関してS家先生達と補正方法を
検討しているので、内容について少し紹介したいと思います。


【水質データの補正について】


水質データはセンサーで計測していますが、湖やダムなど特に野外で測定
している場合はうまくデータが取れていないことが多いです。
(私のスマートウォッチのセンサーで測った心拍数などは見ている限り欠測も
エラーも無いんですけどね(;´Д`))
野外に設置したセンサーのデータが乱れるのにはいろんな原因があるんです
が、その中でも機械の個体差と言うんでしょうか?
各センサーの校正に使う標準液の濃度の微妙な違いがデータの計測値に影響
する場合が以下です。

(上からpH、PCY(アオコの蛍光色素)、クロロフィル)

画像15

とあるダムデータです。縦方向に水深、横方向に時間です。
矢印で示している5/18付近以降ChlaとPCYの計測データの全層に渡ってスケールが小さくなっているのが分かります。
確認するとこのときセンサーの交換を行っているのだとか。
図でお見せしているデータのように、全体的に大きな欠測や乱れがなく、かつセンサー交換後にデータの連続性が失われていない場合は、私たちの間では補正が可能と考えています。

また、測定原理からして“一番狂いやすいpHのデータが比較的きれいに取れている場合、他の項目は補正対象のデータと考えていいはず”という基準で補正処理を行います。

次にどうやって補正を行うのか?と言う点ですが、詳しくは次回に説明したいと思います。

     

***55へ続く***      このページ最初に戻るこのページ最初に戻る ヘビカノTOPに戻るヘビカノTOPに戻る 環境システムTOPに戻る

0701**20220304


     

【第55回】 データの補正について

漫画55今日はデータの補正について詳しく説明していこうと思います。
補正には直線の一次式を使います。他社のエレベーションの変換にも一次式が利用されていることから、割とこの方法が一般的なようです(知らなかった!)

【補正式】

この式のxに元のデータを代入して補正後のデータを計算します。
との値はどうするかというと、以下のフローチャートに従って適切な値を導き出します。

im16

このフローチャートは私の発表資料から抜粋したものですが、
データの補間から最終的にコンターによる図化を行うまでの工程をまとめた資料です。
まず(1)の工程ですが、センサー交換日の前後で同じ時間帯の鉛直データを各1つずつ抽出します。
なぜ同じ時間帯かというと、水温・クロロフィル・PCYなど多くの項目は
日周変動するので、補間を行う上でこのようなセンサー交換以外の誤差要因を排除するためです。

次に(2)では、
(1)で抽出した鉛直データ(図化するとわかりやすい)を比較します。
センサー交換前のデータと交換後のデータの分布が似ていればこれら2つのデータに相関関係があるか散布図を使って調べます。

散布図の直線近似式()からR2の値が±0.6以上であれば相関があると判断し、
(3)で直線式のxにスケールの低い方の生データを代入します。
±0.6未満であれば抽出した鉛直データが適切な組み合わせではなかったとし、
(1)に戻ってもう一度同じ作業を行います。

センサーの項目によって多少の誤差はありますが、補間前↓は5/18以降確認しづらかった日周変動が、

補間前図

補間後はこのようにはっきり浮き出ます。

補間後図
今日紹介した補完方法は、センサーの個体差による誤差を修正してなるべくきれいなデータにしたいときに有効です。
結果を見ての通り、完璧に修正できるわけではありません(^_^;
ですが、きれいなデータに整えることはディープラーニングには欠かせない行程の一つなので、
今後も検討していきたいと思います。

今回はここまでです♪

     

***56へ続く***      このページ最初に戻るこのページ最初に戻る ヘビカノTOPに戻るヘビカノTOPに戻る 環境システムTOPに戻る

0701**20220318


                  

【第56回】 ライブラリ編2ー#1.バージョンアップの罠

漫画56

*注*
グーグルの自動翻訳がオンになっていると、画像が乱れる事があります。
その場合は翻訳をオフにしてください。

皆さんこんにちは。
プログラムを作っていると自他共にいろんな要望が出てくるので、
なるべくそれらを組み込むようにコーディングしているモトハシです。
最近ライブラリのバージョンによってコードを上手く使い分けしないと、
警告文がでたり、マウスポインターのぐるぐるが無限ループ(処理がストップ)する
事を知りました…
omgなもとちゃん
今日は長年使っていたパロちゃん(matplotlib)2.1.0から3.3.1にアップ
グレードしたのに、結局3.2.2にダウングレードした話をご紹介します…。

パロちゃんと言えばグラフの描画をするためのライブラリですが、
このブログでもmatplotlib を用いた図化のスクリプトをいくつか紹介してきました。
2022年2月までに公開されている記事のスクリプトはPython3.6、Matplotlib 2.1.0で正常に起動するコードです。

matplotlib 2.1.0はかれこれ3年くらい使い続けていたバージョンなんですが、
あるとき、「グラフスタイルのx軸・y軸のラベルの配置を変更できたらいいな」という要望を受けてベースの開発環境にあるmatplotlibを2.1.0→3.3.1にアップグレードしました。

matplotlib 3.3.1であれば、
ax.set_ylabel(loc=「‘top’ ‘center’ ‘bottom’」)、
ax.set_xlabel(loc=「‘right‘ ‘center‘ ‘left‘」)
これらのプロパティで位置を指定できます。


例えばこのスクリプトの実行結果が以下のグラフです。
結果
yラベルの位置を変更することが出来ましたね。
私が知る限り、軸ラベル位置調整はmatplotlib 3.3.1で可能ですが、他の2.1.0、3.2.2で同じスクリプトを
実行するとloc」というプロパティは存在しない為以下のようなエラー文が表示されます。

警告

3.3.1優秀!!これからこの子をメインに使っていこうと思った矢先です。
S家先生からseabornを使ったコンター図の作成を頼まれました。

そこで、matplotlib 3.3.1にアップグレードした状態で前もって作成していたプログラムを開いて処理を実行していたところ、
UserWarning: FixedFormatter should only be used together with
FixedLocator
」というこれまで一回も見たことのない警告が出ました…。

これ、初見でなんの警告かさっぱりだったんですが、下の例文を見てください。

例文
私の場合このプログラムを先頭から実行していくと、22行目を実行した後以下の警告文が出ます。
(何回か試しましたが、x軸、y軸どちらも警告が出るときと出ない時があります。
あと、そもそもこの警告が出るのはmatplotlib 3.3.1のエラー?らしいです)



FixedFormatterは、FixedLocatorと一緒にのみ使用する必要がありますということから(おそらく)
ticker.LinearLocatorで軸の主目盛りの個数と位置を決めた後にset_xticklabel やset_yticklabelを使って
任意のラベルを割り当てることが良くないのかなあ?

調べてみるとなぜかGitHubのpandasレポートに、matplotlib 3.3.1の警告文についていくつか記載があり、
警告が出ないよう修正された例文も挙がっていました。
が、回りくどくてよく分かりませんでした(笑)

例文は31行のシンプルなプログラムなので、警告が出たとしても処理自体は停止することなくグラフもこのように辛うじて出力されます。



ですが、同じキャンバスに複数の図を描かせるような複雑な描画プログラムを実行すると、
処理は停止・画面フリーズ・図も大半が白紙になってしまうようです(↓こんな結果に)


白紙
警告が出ないようにコードを書き換えようにも、コンターはseabornを使って描画しているので、
置きたい位置に確実に目盛りを振って、その目盛りに自由度の高いラベルを設置するのは意外と大変なんです・・・。
それに、何より何ヶ月もかけて完成させた963行にもなる描画プログラムを書き換えるのはものすごく面倒でした。

この件でパロちゃんには少々腹が立ちましたが、matplotlib 3.2.2にダウングレードしたところ、同様の警告文と図が描けないトラブルは発生しませんでした。

ライブラリのバージョンが変わると仕様が変わるんですね(;´Д`)
このような不具合に関する情報はGitHubでも公開されています。
参考になるか分かりませんが、皆さんも気をつけてくださいね。


(※GitHubとは平たく言えばエンジニアの為の無料で使えるコミュニティで、個人で開発したプログラムの公開や、また動作に不具合があった場合の修正が行える他、エンジニア同士の情報共有が可能な場です。)

***57へ続く***      このページ最初に戻るこのページ最初に戻る ヘビカノTOPに戻るヘビカノTOPに戻る 環境システムTOPに戻る

0701**20220401


                  

【第57回】 雑談編⑦ー趣味の話とお手伝いM川さんの登場

漫画56こんにちは、もうすっかり春ですね!
このところ相方Cさんの頑張りもあってHPがかなり賑やかになってきて
いるのですが、皆さんお気づきでしょうか(`・ω・´)!?
また雑誌のヘビカノ漫画連載も決まって、これから忙しくなりそうです!
モトハシも頑張りたいと思います💡

さて私事ですが、モトハシ家のリビングの出窓にエビの入った水槽を
去年の7月から今年の3月まで半年以上放置していたので、最近やっと別の
水槽にエビを移しました。
放置している間、水替えをしていない上に餌もあげていなかったので、 エビが生きてるのにはビックリしましたが、どうやら水槽内でミジンコ??
らしきものが増えていたようです。

ミジンコ

↑水槽の背面にくっついていたり、水中をふわふわしていたり。気泡と見間違えるくらいの大きさですが、白っぽく半透明の体からは足が
生えていてモゾモゾと動いてました…。
肉眼で確認出来ないのが残念ですがおそらくミジンコ(?)
琵琶湖なんかにはよくいるそうですが、モトハシは理科の教科書でしか見たことが無かったのでつい写真を
撮って観察してしまいました!!笑
ミジンコは水をきれいにする働きがあって、魚の餌にもなるようなので、このまま飼ってみようと思います。

・・・すみません、余談でした(笑)

仕事では、私が水槽を放置し始めたのと同じ時期に入社してくれたM川さんが徐々に職場にも慣れて
S家先生の身の回りのお世話をしてくれたり、モトハシの作業を手伝ってくれたりしています。
立場的に私がM川さんに教えていることになりますが、人にものを教えるとき自分の頭の情報が整理されるので
自分の勉強にもなりますね。
どういう説明の仕方をすれば分かりやすいのか とか、なぜそうするかの理由とか・・・。
それに、M川さんとチームで仕事をしていると2人で確認作業が出来るので間違いが減りますし、
モトハシの詰めの甘さを正してくれています(笑)

これからの活躍に期待です(*^_^*)

***58へ続く***      このページ最初に戻るこのページ最初に戻る ヘビカノTOPに戻るヘビカノTOPに戻る 環境システムTOPに戻る

0701**20220415


                  

【第58回】 ライブラリ編2ー#2.機械学習ライブラリscikit-learnのスケーリングについて

漫画58皆さんごきげんよう(^_^)v
今日はscikit-learnに挑戦する第一歩として、sklearn.preprocessingという
パッケージを使ってデータのスケーリングにチャレンジしてみたいと
思います。

機械学習・深層学習の前提として、多くは何らかの数値で表した特徴量から、
対象データの特徴を学習し、予測や分類を行います。その為、

①用意したデータの特徴にテキストが含まれている場合、
これを仮の数値に置き換えたり、

また特徴量によって単位が異なるデータを扱う場合、
値が極端なデータが含まれている場合にスケール調整をするなど、

これら前処理をしっかり行う事で予測・分類精度が向上する事があります。

sklearn.preprocessingについて簡単に説明すると、
これは上記の②にあたる処理で、単純に内部計算にかかる負担を軽減する
効果もありますが、特に使用する学習アルゴリズムがデータの分散を元に
評価する場合に有効です。
一般的によく利用されるスケーリング手法は、正規化や標準化です。

今日は外れ値を含んだデータを用意し、
sklearn.preprocessing.StandardScaler:標準化
sklearn.preprocessing.RobustScaler:外れ値に強い標準化

これらを使ってスケーリングした結果データがどのように変化するか
確認したいと思います💡

RobustScaler

RobustScalerとは四分位範囲を使ったスケーリングで、
外れ値に影響されにくいという特徴があります。このスケーラーを使う事で
データクリーニングを含む前処理が楽になると良いんですが…。

ではコードをみていきましょう。

画像27

df1は某ダムの水温データで、行方向に水深、列方向に時系列という並びになっています。
各列単位は統一されていますが、外れ値で値の変動が大きい箇所があります。
今回使うスケーラー(StandardScaler/ RobustScaler)はいずれも列方向に処理を行う仕組みなので、
まずはXdf1.T.valuesで行列の入れ替えを行います。↓

画像28

行列の入れ替えが出来たら、各スケーラーを対象データに適応させます。
今回は表層0.5m地点の時系列データを参考に結果を見てみましょう。

画像29

画像30

スタンダード・ロバストどちらも元の値と比べてスケールが小さくなっています。
ほとんどの値は1から-1の範囲に収まっていますね。
サンプルデータの数が多い場合はこのようにスケールを小さくすることで計算にかかる負担を軽減できます。


外れ値

次に外れ値についてです。
X軸の1800付近にある外れ値は「元の水温データでは169℃となっています。
「スタンダード水温」では31.90、「ロバスト水温」では20.97。
スタンダードは外れ値に引っ張られたマッピングとなり、ロバストの方が外れ値の影響を受けにくい
マッピングとなっています。


スタンダード・ロバストともに外れ値自体はスケーリングされた後もデータに残ったままとなってるので、
169℃のようなあり得ない数値の箇所はいずれにせよ除去が必要となります。


標準化を使う場合は最初に外れ値を全て取り除いてからスケーリングするのが適しており、
ロバストの場合はスケーリング後に外れ値を取り除いたとしても、他の値への影響が少ないという事ですね💡

実世界の体重と身長の関係や所得データなどと違い、水質データ時系列に関しては、
例えばグラフ上の「元の水温データのX軸2000付近の水温20℃のという箇所も
(計測値自体は外れ値ではないですが、前後の値から不自然と判断できる為)
なるべく外れ値として扱わないといけない分、前処理は大変です💧

モトハシがサイキット・ラーンのスケーリングを試して思ったことは、
結局外れ値や欠測値を都合良くはじく機能は存在せず、地道に手作業で修正していくしかない
のだ…と痛感(゚´Д`゚)



“機械学習ライブラリのスケーリング機能なら外れ値除去機能くらい付いていそう“という思惑は
見事に裏切られましたという話でした(笑)

***59へ続く***      このページ最初に戻るこのページ最初に戻る ヘビカノTOPに戻るヘビカノTOPに戻る 環境システムTOPに戻る

0701**20220506