kakakakakku blog

Weekly Tech Blog : Keep on Learning 👍

Pandas で指数表記を無効化する

Jupyter Notebook で Pandas のコードを実装しているときに「指数表記を無効化」する場合は pd.options の display.float_format を設定する.以下にサンプルとして「桁数 2」と「桁数 6」の例を載せておく.

# 小数点以下 桁数 2
pd.options.display.float_format = '{:.2f}'.format

# 小数点以下 桁数 6
pd.options.display.float_format = '{:.6f}'.format

pandas.pydata.org

DataFrame で動作確認する 🎯

random.uniform で取得した乱数を3乗した適当な値を DataFrame にする.デフォルト設定だと e+08 のように指数表記になる.

import pandas as pd
import random

df = pd.DataFrame(
    {
        'id': [1, 2, 3],
        'dest': [random.uniform(100, 1000) ** 3, random.uniform(100, 1000) ** 3, random.uniform(100, 1000) ** 3]
    }
)
df

#    id          dest
# 0   1  5.343391e+08
# 1   2  1.095209e+08
# 2   3  5.267437e+08

次に pd.options の display.float_format に '{:.2f}'.format を設定する.桁数 2 で指数表記を無効化できた!

pd.options.display.float_format = '{:.2f}'.format
df

#    id         dest
# 0   1 534339073.50
# 1   2 109520894.40
# 2   3 526743661.86

今度は pd.options の display.float_format に '{:.6f}'.format を設定する.桁数 6 で指数表記を無効化できた!

pd.options.display.float_format = '{:.6f}'.format
df

#    id             dest
# 0   1 534339073.500472
# 1   2 109520894.397633
# 2   3 526743661.855074

Jupyter Notebook の実行結果も載せておく!

関連記事

kakakakakku.hatenablog.com

Pandas で NDJSON (.jsonl) を読み込む

Pandas で NDJSON (Newline Delimited JSON) を読み込む場合 read_json() 関数に lines=True パラメータを設定すれば OK!

pandas.pydata.org

NDJSON サンプル dataset.jsonl

{ "id": 1, "name": "Alice" }
{ "id": 2, "name": "Bob" }
{ "id": 3, "name": "Kakakakakku", "blog":  "https://kakakakakku.hatenablog.com/" }

サンプルコード ndjson.py

import pandas as pd

df = pd.read_json('./dataset.jsonl', lines=True)
print(df)

実行すると期待通りに DataFrame を表示できた!

$ python ndjson.py
   id         name                                 blog
0   1        Alice                                  NaN
1   2          Bob                                  NaN
2   3  Kakakakakku  https://kakakakakku.hatenablog.com/

無料で受験できる Python 新試験「PythonZen & PEP 8 検定試験」に合格した

2022年3月1日に β リリースになった「一般社団法人 Python エンジニア育成推進協会」の新試験「PythonZen & PEP 8 検定試験」に合格した💡現在まだ β だけど合格すると「本認定」になる.PythonZen (PEP 20 - The Zen of Python) と PEP 8 から出題されるため,どのように Python で「良いコード(良いとは何だろう?)」を書くかというお作法の理解を確認できる.試験とは言え,受験料は「無料」だし自宅で「24時間いつでも」受験できるから気軽に挑戦してみると良いんじゃないかと✌️

www.pythonic-exam.com

プレスリリースを読んでいたら本試験をリリースした背景が載っていた.Python を知らない人が書いている書籍 や PythonZen や PEP 8 を知らない講師 と書いてあり,プログラミング教育界隈としては危機的状況に思える.本試験で全てを解決できるとは思わないけど,PythonZen や PEP 8 を意識するきっかけにはなるし価値はあると思う.本試験の普及を応援するためにもブログを書いている.

Python 需要の増加に伴い、Python の関連書籍やプログラミングスクールが増える一方、Python を知らない人が書いている書籍や PythonZen や PEP 8 を知らない講師が、不適切な Python 文法を教えてしまうケースが散見されています。

試験概要 🐍

試験概要は以下のサイトに載っている.申込みをしたらすぐにメールで試験 URL が送られてきて受験できる.場合によっては迷惑メールになるという注意点が載っていたけど Gmail で本当に迷惑メールに判定されていて最初気付かなかった😇

  • 試験名称 : PythonZen & PEP 8 検定試験
  • 概要 : PythonZen (The Zen of Python) と PEP 8 に関する知識を問う試験
  • 受験料 : 無料 ✌
  • 問題数 : 20 問(全て選択問題)
  • 合格ライン : 70 %
  • 試験方式:WBT (Web Based Training) → ビデオ監視など特別な要件はなく気軽に受験できる🌸
  • 出題範囲:PythonZen と PEP 8 より出題

pythonzen-pep8-exam.jp

PythonZen (PEP 20 - The Zen of Python) 🐍

PythonZen (PEP 20 - The Zen of Python) は以下のサイトに載っている.Python を書くときの「格言(心構え)」とも言える.個人的に好きなのは以下!なお Zen は 禅 を意味している.

  • Readability counts.(読みやすさは重要)
  • Although never is often better than right now.(でも今すぐやるよりもやらない方が良いことも多い)

www.python.org

また Python インタプリタを起動して import this を実行すると PythonZen (PEP 20 - The Zen of Python) を表示できる!

>>> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

PEP 8 🐍

PEP 8 は以下のサイトに載っている.Python の「コーディング規約」としてよく使われていると思う.コードのお作法として良し悪しを宣言している部分もあるし,例えば,文字列に使う引用符である " と ' は推奨までは宣言せず「統一すること」と書いてあったりもする.最終的には PEP 8 をディスカッションのテーマにして,プロジェクトで決めていく必要がある.

www.python.org

個人的には import 順序の理解が曖昧だったり,Ruby に慣れていて無意識に { eggs: 2 } と書いてしまって不要な半角文字が入ってしまう場合があったりするけど,普段は pycodestyle や Pylint を使って CI で検知している.

github.com

PEP 8 はサンプルコードも載っていて英語でも比較的読みやすいとは思うけど,日本語に翻訳するプロジェクトもあって,更新もされている.以下も合わせて参考にすると良いと思う.

pep8-ja.readthedocs.io

まとめ 🐍

2022年3月1日に β リリースになった「PythonZen & PEP 8 検定試験」に合格した💡ほとんど準備はせず,PythonZen (PEP 20 - The Zen of Python) と PEP 8 をザッと1度読んですぐに受験した.1問間違えてしまって「95点」だった.間違えた問題と回答もメールで送られてくるので復習もしやすくて良かった.合格者番号は PEP-0-000233 だからそこそこ早く合格できたかも!(そもそも2日前まで新試験のリリース情報に気付いてなかったことが悔やまれる🌀)

もし PythonZen (PEP 20 - The Zen of Python) と PEP 8 どちらも未経験の場合は,サンプルコードを書きながらドキュメントを1,2度読んでみると十分合格ラインには到達できる気がする💪

まとめると「PythonZen & PEP 8 検定試験」は無料で受験できる Python 新試験でおすすめ!特に「合格したから○○」という価値を求めるのではなく,PythonZen (PEP 20 - The Zen of Python) と PEP 8 を学ぶことにより,Python でコードを書く前の準備運動になったり,プロジェクトメンバー間で共通認識を築いたりするきっかけとして有効だと思う!

関連試験 🐍

なお「一般社団法人 Python エンジニア育成推進協会」から提供されている「Python 3 エンジニア認定基礎試験」と「Python 3 エンジニア認定データ分析試験」も過去に受験して合格している.詳しくは以下の記事を読んでもらえればと!

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com

Scratchpad は便利!Jupyter Notebook で検証用のセルをシュッと追加する

Jupyter Notebook でコードを書いているときに「検証のために一時的にセルを追加してコードを書いて終わったらセルを消す」という操作を頻繁にしている(表現しにくいけど...).些細な操作ではあるけど地味に面倒だった.

そこで「Scratchpad」を使ったら便利だった!「Scratchpad」は nbextensions を有効化すればすぐに使える.Jupyter Notebook の右下に表示されている ▼ アイコンをクリック(もしくは Ctrl-B)すると一時的に使えるセルが出てきて書き捨てのコードを気軽に実行できる.

便利だー👏

f:id:kakku22:20211218183323p:plain

Feature Engineering : Kaggle Courses で「特徴量エンジニアリング」を学ぶ

Kaggle が公開している「Kaggle Courses」で「Feature Engineering」コースを受講した.機械学習モデルを構築するときに重要になる「特徴量エンジニアリング」を多岐にわたる観点から学べる.「特徴量エンジニアリング」の目標は「データセットを目の前の問題に対してより適切な形にすること」であるとコースでは紹介されていて,より具体的には以下となる.

  • モデルの予測パフォーマンスを向上させるため
  • 計算またはデータのニーズを削減するため
  • 結果の解釈可能性を向上させるため

www.kaggle.com

アジェンダ ✏️

「Feature Engineering」コースは「計6種類」のレッスン(ドキュメント)と「計5種類」のレッスン(演習)から構成されている.「相互情報量」や「K-means」や「主成分分析 (PCA)」や「Target Encoding」など,多岐にわたる.

  1. What Is Feature Engineering
  2. Mutual Information
  3. Creating Features
  4. Clustering With K-Means
  5. Principal Component Analysis
  6. Target Encoding

また「Feature Engineering」コースの前提になる「Intermediate Machine Learning」コースは既に受講していて,以下にまとめてある.

kakakakakku.hatenablog.com

相互情報量 ✏️

まず,特徴量とラベルの関係を知るために「相互情報量 (Mutual Information)」を使う.よく Pandas の corr() 関数を使って「相関係数」を算出するけど,あくまで「相関係数」は2種類のデータが「線形的な」関係性のときに使う.「相互情報量」は線形的な関係性でなくても使える.簡単に表現すると「相互情報量」とは「A が B の不確実性を低減する尺度」と言える.

kakakakakku.hatenablog.com

そして scikit-learn の feature_selection モジュールには「相互情報量」を計算する関数として mutual_info_regression() : 回帰 と mutual_info_classif() : 分類 がある.

今回は Kaggle の住宅価格を予測する「住宅データセット」を使う.

www.kaggle.com

今回は住宅価格を予測する回帰問題であるため mutual_info_regression() を使って SalePrice(住宅価格) との「相互情報量」を計算する.以下にソートした結果を表示する.結果を読み解くと OverallQual(全体的なクオリティ) や Neighborhood(地域内の場所) や GrLivArea(リビングの広さ) や YearBuilt(建設日) など,まぁ一般的に考えて重要そうな特徴量が上位になっている.なお「相互情報量」が低くても重要な特徴量はあるため,最終的には「ビジネス理解」が重要とも書いてあった.

OverallQual     0.581262
Neighborhood    0.569813
GrLivArea       0.496909
YearBuilt       0.437939
GarageArea      0.415014
TotalBsmtSF     0.390280
GarageCars      0.381467
FirstFlrSF      0.368825
BsmtQual        0.364779
KitchenQual     0.326194
ExterQual       0.322390
YearRemodAdd    0.315402
MSSubClass      0.287131
GarageFinish    0.265440
FullBath        0.251693
Foundation      0.236115
LotFrontage     0.233334
GarageType      0.226117
FireplaceQu     0.221955
SecondFlrSF     0.200658
Name: MI Scores, dtype: float64

特徴量抽出 ✏️

次に新しく特徴量を抽出する「計5種類」の手法を学ぶ,それぞれを以下に簡単にまとめる.

1. Create Mathematical Transforms(数学的変換)

例えば,GrLivArea(リビングの広さ) と LotArea(ロットサイズ)から,新しく LivLotRatio(ロット比率) を計算する.

X_1["LivLotRatio"] = df.GrLivArea / df.LotArea

2. Interaction with a Categorical(カテゴリ変数)

例えば,BldgType(住居タイプ) を One-Hot エンコーディングをする.

X_2 = pd.get_dummies(df.BldgType, prefix="Bldg")

kakakakakku.hatenablog.com

3. Count Feature(カウント)

例えば,OpenPorchSF(オープンポーチエリア) など「Porch(建物の外壁から突き出している部分)」の総和を計算する.

X_3["PorchTypes"] = df[[
    "WoodDeckSF",
    "OpenPorchSF",
    "EnclosedPorch",
    "Threeseasonporch",
    "ScreenPorch",
]].gt(0.0).sum(axis=1)

4. Break Down a Categorical Feature(カテゴリ変数を区切る)

例えば,MSSubClass(販売に関係する住居タイプ) には One_and_Half_Story_Finished_All_Ages や One_Story_1946_and_Newer_All_Styles という「カテゴリ変数」が含まれているため _ で文字列分割をした1個目(今回で言えば One)を抽出する.バリエーションを減らすために使う.

X_4["MSClass"] = df.MSSubClass.str.split("_", n=1, expand=True)[0]

5. Use a Grouped Transform(グループ化)

例えば,Neighborhood(地域内の場所) でグループ化をした GrLivArea(リビングの広さ) の中央値を特徴量にする.カテゴリ変数の値によって差が出る場合に効果のある特徴量になりそう.

X_5["MedNhbdArea"] = df.groupby("Neighborhood")["GrLivArea"].transform("median")

K-means ✏️

次は「教師なし学習」の代表的なアルゴリズムである「K-means」を使ってクラスタリングを行う.今回は「5種類の特徴量」から「10種類のクラスタ」を探索する.クラスタリングの結果 0 ~ 9 の値を Cluster という新しい特徴量として追加している.以下はサンプルコードを抜粋して載せている.

X = df.copy()
y = X.pop("SalePrice")

features = [
    "LotArea",
    "TotalBsmtSF",
    "FirstFlrSF",
    "SecondFlrSF",
    "GrLivArea",
]

X_scaled = X.loc[:, features]
X_scaled = (X_scaled - X_scaled.mean(axis=0)) / X_scaled.std(axis=0)

kmeans = KMeans(n_clusters=10, n_init=10, random_state=0)
X["Cluster"] = kmeans.fit_predict(X_scaled)

また Seaborn で可視化をして,特徴量ごとにどのようにクラスタリングされているのかを確認することもできる.

f:id:kakku22:20211202141634p:plain

主成分分析 (PCA) ✏️

「主成分分析 (PCA)」も「教師なし学習」の代表的なアルゴリズムで以下の目的で使うことができる.

  • Dimensionality reduction(次元削減)
  • Anomaly detection(異常検出)
  • Noise reduction(ノイズリダクション)
  • Decorrelation(非相関)

今回は以下の「4種類の特徴量」で「主成分分析 (PCA)」を実行する.必ずしも次元削減をする必要はなく,データの特性(分散など)を計算することにも使える.今回は scikit-learn の PCA で pca.fit_transform(X) を使う.

  • GarageArea(ガレージサイズ)
  • YearRemodAdd(リフォーム日)
  • TotalBsmtSF(地下室サイズ)
  • GrLivArea(リビングの広さ)

scikit-learn.org

そして,PC1 ~ PC4 という「4種類の特徴量」を抽出することができる.そして,以下のように「loading(主成分負荷量)」を表示すると,例えば,PC1 は「広さ」に着目した値になっているように考えることができる.また PC3 は GarageArea(ガレージサイズ) も YearRemodAdd(リフォーム日) も 0 に近いため「リビングと地下室の関係性」 に着目した値になっているように考えることができる.

                   PC1       PC2       PC3       PC4
GarageArea    0.541229  0.102375 -0.038470  0.833733
YearRemodAdd  0.427077 -0.886612 -0.049062 -0.170639
TotalBsmtSF   0.510076  0.360778 -0.666836 -0.406192
GrLivArea     0.514294  0.270700  0.742592 -0.332837

f:id:kakku22:20211202152718p:plain

まとめ ✏️

「Kaggle Courses」で「Feature Engineering」コースを受講した.「特徴量エンジニアリング」として使うテクニックなどを多岐にわたって学べてとても良かった.そして,改めて「ビジネス理解」が重要だなと感じることができた.また「主成分分析 (PCA)」の活用に関しては個人的にまだ理解が浅いため引き続き学んでいく!

f:id:kakku22:20211202142251p:plain

関連記事