エラーメッセージ「OverflowError: Exceeded cell block limit (set 'agg.path.chunksize' rcparam)」の対処
久々の更新
matplotlibを使ってみたらこんなメッセージが出た
OverflowError: Exceeded cell block limit (set 'agg.path.chunksize' rcparam)
該当するところは描画のところ
plt.plot([3万行くらいのリスト],[3万行くらいのリスト])
サイズのところが悪さをしていたらしい
plt.figure(figsize=(10, 6)) plt.subplot(2, 1, 1)
コイツらをコメント化したら治った
バイアス-バリアンス分解の導出を真面目にやる
どうもです.
只今,下記の書籍にを用いて勉強中です.
- 作者: 国友直人
- 出版社/メーカー: 朝倉書店
- 発売日: 2015/08/25
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
さぁ,なんということでしょう~,式の行間が開きすぎてよくわかりません.他の書籍で調べてもこんな感じで端折ってありますし,ネットで調べても「期待値の計算すれば上手いこと消えてほしい項が0になってくれます」みたいな感じで,きちんとと書いている記事が直ぐには見当たりませんでした.
なので,折角なので勉強がてらに式の展開をしてみます
展開
二乗誤差を計算すると
ここで,第三項について,とは定数であることを考慮すると,
よって,元の式は
Windows環境下でPython版のglmnetを使うとどうなるか?
夏のある日のこと,
私はLasso回帰を用いてあるデータを分析しようとしていた.
glmnetを呼び出して実行したところ,
x input must be a scipy float64 ndarray
とエラーメッセージが帰ってきた.
あれ?っと思ったけど,その日に扱っていたのは整数値だったことを思い出した.
しゃぁ無いから浮動小数点数にキャストしてみたんだ.
これで間違いは無いはず.
スクリプトを実行してみると・・・
raise ValueError('loadGlmlib does not currently work for windows')
ValueError: loadGlmlib does not currently work for windows
なん・・・だと・・・・
これwindows環境では動かんのかい!!
諦めて,教えてもらったAzureNotebookを使うかな.
StatsModelsとscikit-learnのElastic Net(Lasso回帰)を比較してみた
最近スパース推定の勉強会に参加しております.使っているテキストはこちら.
スパース推定法による統計モデリング (統計学One Point)
- 作者: 川野秀一,松井秀俊,廣瀬慧
- 出版社/メーカー: 共立出版
- 発売日: 2018/03/08
- メディア: 単行本
- この商品を含むブログを見る
今回使うデータはこちら.リンク先のヘッダの「Earn」が観測日の売上.「MaxTemp」が観測日の最高気温で「MinTemp」が最低気温.「Humi」は観測日の湿度.「Wind」は風の強さ.「Sun」は日照時間です.この「Earn」売上に直結する項目は何かを分析することが目的です.
ちなみに,このデータは昔お世話になったアイスクリーム屋さん・ハンバーガ屋さんの統計をイメージして作成したものです.なので実際の現象とは異なりますのであしからず.
各項目の相関係数を出してみるとこんな感じです.「Wind」がわざとらしいほどに無相関ですね.
各項目の関係をグラフにするとこんな感じ.
明らかに「Wind」がやる気がない数字が入ってますね.(まぁ,だってそういう風に作ったんだもん)
StatsModelsのエラスティックネットを用いてPythonスクリプトを書いてみた
統計を用いた分析をする時に「StatsModels」を使うか「scikit-learn」を使うか悩ましかったりします.StatsModelsはPandasのDataFrameを直接使うことができるので,私はどちらかというとStatsModelsを使うことが多いですね.現時点ではscikit-learnはDataFrameを受け付けないですが,そのうち変更があったらどうなるか分かりません.といってもscikit-learn昔書いたこちらの記事を参照にDataFrameからListに変換してあげればいいだけなんですけどね.
StatsModelsのエラスティックネットのドキュメントはこちらこちら
さて,下記のように書いてみました.
この書籍では罰則項を増加させたときの回帰係数を描画した解パス図というのを紹介していました.これに習って同じものを描いてみるとこんな感じ.
あれ?なんか変だぞ??この場合は一番売上に一番関係なさそうな「Wind」が先に消えるんじゃないの??
なんか変なのでscikit-learnではどういう振る舞いを見せるのかやってみました.
scikit-learnによるエラスティックネット
scikit-learnを使ったエラスティックネットはネット上にサンプルコードが山ほどあるのでここでは特に記載しません.Gitには上げておいたので,興味がある方は下記を参照ください.
さて,同じように解パス図を書くとこんな感じ.
あれ?StatsModelsとsklearnで結果が違う・・・・
そんな馬鹿な,,という感じですが原因不明です.これでは余りにも内容がない記事になってしまいますので,あとで加筆します.
ではそんな感じで.ではでは.
データフレームの各行の差を計算してグラフ化する:Pandas
やりたいことしては,タイトル通り『データフレームの各行の差を計算してグラフ化する』ことです.Pandasのデータフレームを用いて各列の時間差を計算してグラフに出力するということをやります.
今回はTimedelta型を使っているのですが,データフレームの差を計算して描画しようとすると「'Timedelta' object has no attribute 'plot'」というエラーメッセージ出てきます.無理やりint型になおして出力するとナノ秒になってしまうので,これを上手く工夫して出力しなくてはなりません.
ここからが本題
さて,こんなデータを使います.各駅の名前とそこを通過する時間が記載されているデータがあるとします.
//time.csv hakata,10:00:05.156 yoshiduka,10:29:54.731 kadomatu,11:03:44.195 katuragawa,11:38:32.395 tendou,12:09:21.151 iiduka,12:46:10.364 kokura,13:21:59.996
このとき前の駅から今の駅まで到着するのにかかった時間を計算してグラフに出力します.
Python3のコード
import pandas as pd import matplotlib.pyplot as plt import matplotlib.mlab as mlab # CSVデータの読み込み df = pd.read_csv('data/time.csv', header=None, names=['sta', 'time']) # 時間型に変換 df['time'] = df['time'].apply(lambda xx: pd.to_datetime(xx)) # 時間差の計算.各行の差を計算する df_e =df['time'].diff(1).fillna(0) # 描画 fig = plt.figure() ax = fig.add_subplot(111) ax.plot(df['sta'], df_e) # ナノ秒から変換 def toChange(y, i): h = int(y / 1000000000 / 3600) m = int(y / 1000000000 / 60) s = int(y / 1000000000 % 60) return '%(h)02d:%(m)02d:%(s)02d' % {'h': h, 'm': m, 's': s} from matplotlib.ticker import FuncFormatter as ff ax.yaxis.set_major_formatter(ff(toChange)) plt.grid() plt.show()
結果
するとこんなふうに出力されます
Pandasデータフレーム内の複数の文字を「.str.split」を使って区切る
Pandas(@Python)のデータフレーム内のstringを複数の文字で区切りたい場合があります.
「.str.split」を使うのですが少し工夫が必要です.
まぁ,簡単に言うと縦棒「|」で区切るわけですよ.
import pandas as pd df = pd.DataFrame( {'Time': ['jt=10:00:00:-p', 'jt=10:01:01:-p', 'jt=10:10:02:-p', 'jt=10:50:03:-p', 'jt=11:00:04:-p'], 'Value': [25, 30, 104, 52, 41]}) df_spr = df['Time'].str.split('=|:-', expand=True) print(df_spr)
出力すると・・
0 1 2 0 jt 10:00:00 p 1 jt 10:01:01 p 2 jt 10:10:02 p 3 jt 10:50:03 p 4 jt 11:00:04 p