僕がデータ分析者として覚醒するまで

しがない会社員がデータ分析者として覚醒するまでのブログ

Python_特殊メソッド__str__

概要

  • datetime.date(2019,5,21)をインスタンス化した後に、print(instance)で文字列が返ってくるのが気になった。

コード

class testclass:
    def __init__(self,val1,val2,val3):
        self.year = val1
        self.month = val2
        self.day = val3
        
    def __str__(self):
        print('OK')
        return str(self.year) + '-' + str(self.month) + '-' + str(self.day)

aa = testclass(2019,11,1)

print(aa)
>> 2019-11-1

賢くなった点

  • __init__は割とよく使うけど、__str__を初めて使った。
  • 今までいちいち関数にprint書いてたけど、書かなくてよくなった。

【備忘録】pythonを使ってftp接続し、最新フォルダを取得する

概要

  • ftp接続し、最新フォルダを取得する。

覚書

  • ftplibでftp接続しフォルダにアクセスする。
  • フォルダは自動生成され、フォルダ名称はint型の数値でインクリメントされたものになる。
  • ファイルとフォルダの判断は、.(ピリオド)の有無で行っている。

Code

  • 最新フォルダを取得するまで
from ftplib import *

ftp = FTP('192.168.1.1')
ftp.login()
ftp.cwd('LOGGING/FOLDER')

def select_folder():
    # カレントディレクトリからフォルダを探し、folder_listに格納する
    folder_list = []
    for object_name in ftp.nlst():
        if '.' in object_name:
            print('{}はファイルです。'.format(object_name))
        else:
            print('{}はフォルダです。'.format(object_name))
            folder_list.append(object_name)
        accsess_folder = 0
    
    # folder_listをint型に変更し、数値が最も大きいものをアクセスするフォルダとしてreturnする。
    for folder_name in folder_list:
        print(int(folder_name))
        if int(accsess_folder) < int(folder_name):
            accsess_folder =folder_name
    
    print('最新のフォルダは{}です。'.format(accsess_folder))
    
    return accsess_folder

ftp.cwd(select_folder())

懸念点

  • エラー処理全くなし
  • フォルダ数が増えたときにどうしよう

なぜ作ったか

  • 会社のおじさんにこういうのできないって言われたから
  • 30minで作ったけど、ここからおじさんは改良できるんだろうか

RandomForest

概要

  • ランダムフォレストとは、弱学習器の決定木たくさん使って、単体の決定木より予測精度を向上させましょうというもの
  • 回帰でも分類でもどちらでも使用できる
  • 弱学習器を重ねる方法は、XGBoostとかLGBMとかもこのアルゴリズムらしい。

昔に書いたもの

qiita.com

  • とある学会で、エネルギーデータを予測するのにとりあえずRandomForestがいいよと聞いてやってみた結果
  • 実際、説明変数を大量に突っ込めばよい結果が生まれるわけではないのだけれど、学会で自信満々に発表されてるのをみてちょっと驚いた。

とはいえ・・・

  • 僕自身もまだふんわりとしかわかっていない
  • ツールとして使えるのはもちろんのこと本質がわかっていないとなぜこのアルゴリズムを選定したのかという明確な回答ができないから勉強あるのみ

賢くなった点

  • 不純度をジニ係数で表すという記述が本には書いてあった。
    • 僕の中ではジニ係数は「所得分配の不平等さを測る指標」という認識が強かった(公務員試験とかにでるよ!)

書いてて思ったけど、まだふんわりしているからもう少し掘り下げて明日も書こう。

ナイーブベイズ(単純ベイズ)

ナイーブベイズ(単純ベイズ

f:id:snuow:20190508231615p:plain

概要

  • 自然言語処理によく用いられるらしい
  • 分類問題に使用
    • 確率に基づいて予測する
    • スパムの除去やカテゴリ分類に利用される

メリット

  • 自然言語処理によってそれなりに良い精度をだしてくれるらしい
  • 名詞のみで予測できるので実装も容易

デメリット

  • 日本語特有の文法や複数の単語の組み合わせには対応できていないため、予測精度が文章によっては予測精度が落ちる可能性がある。

賢くなった点

疑問点

  • BoWっていうやり方だとテキストデータが巨大になればなるほど、カラムが増えて巨大なテーブルができそうなんだけど・・・ほかにやり方があるのかしら?

コーディングのお勉強 @classmethod

わからなかったこと

  • Classをインスタンスにするまえに、methodを呼び出せることが理解できなかった。
  • 下記のclassでtest.methodtest()としたかった。
class test:
  def __init__(self):
    print('初期化')
  
  def methodtest(self):
    print('method_test')
    return self

わかったこと

class test:
  def __init__(self):
    print('初期化')
  
  @classmethod  <-- こいつが必要だった。
  def methodtest(self):
    print('method_test')
    return self

@classmethod

  • @classmethodの使い道がわからない・・・
  • methodを直接使えるのはいいけど、本当はほかにメリットがあるのでは・・・

Ridge回帰とLasso回帰について

読んでる本

ただの線形回帰との違い

  • 過学習を起こしにくい
    • RidgeもLassoも罰則項があり、過学習を起こしにくい

RidgeとLassoの式の違い(2次式の場合)

最初の項とαの項が2乗になっているかいないかの違いがある。

  • Ridge

$$ R(w) = Σ_{i=1}^{n}(y_i-(w_0 + w_1x_i + w_2x_i^{2})^{2} + α(w_1^{2} + w_2^{2}))^{2} $$

  • Lasso

$$ R(w) = Σ_{i=1}^{n}(y_i-(w_0 + w_1x_i + w_2x_i^{2})) + α(|w_1| + |w_2|) $$

αはハイパーパラメータの選定はGridSearchとかでやればいいのかな?

テキストマイニング_単語N-gramモデル

最近、転職活動の一環の勉強として、「自然言語処理の基本と技術」という本を読んでいます。(データサイエンティストとして、自然言語処理も必要だと考えているため)

前回は、Yahooニュースの本文から形態素解析janomeで行った後、名詞をカウントしグラフ化を行いました。上記の本には、単語ユニグラムモデルと呼ばれるモデルがこの方法に該当するようです。

これを拡張したモデルとして、単語N-gramモデルと呼ばれるモデルがあり、これは、かな漢字変換エンジンで利用されているらしい。ただし、ほかにも処理(正規化・平滑化・モデルの圧縮)も行わないと使えないみたいだけど詳しくは本書では書いてないようでした。

このあたりの記述を読んでいるとこうしてブログを書いている途中で様々なかな漢字変換を当たり前にしている技術がこういう風にできているんだと再認識できてとてもよい勉強になっていると思いました。