乙Py先生のプログラミング教室
初学者のためのプログラミング学習サイト

python

乙py式5時間で学ぶプログラミング基礎(python編)


乙py3

短時間でプログラミングを学ぶ事ができる動画講座を作りました。

YOUTUBEの動画と資料を載せておきますので
ぜひ参考にしてくださいませ。


なおPythonチートシートを作成しています。


コーディングに迷った際に役に立ち

WEB検索する時間を無くして

作業時間を効率化できます。

note
Pythonチートシート

目次




1.この講座について
2.プログラミング言語について
3.プログラミング言語の学習方法について
4.プログラミングの学習環境について
5.目標設定について
6.Jupyterの使い方
7.演算
8.文字
9.インデックス
10.変数
11.予約語
12.データ型
13.文字列
14.文字列のフォーマット
15.算術演算子
16.代入演算子
17.関係演算子
18.論理演算子
19.基礎演習1
20.リスト1
20.リスト2
21.タプル
22.辞書型
23.if文
24.for文
25.while文
26.組み込み関数について
27.enumerate関数
28.zip関数
29.ソート
30.内包表記
31.基礎演習2
32.関数
33.global変数とスコープ
34.無名関数
35.オブジェクト指向の話
36.クラスについて
37.例外処理
38.ライブラリの利用
39.基礎演習3
40.まとめ
付録.その先、仕事とか、研究にどう使えるの?

今回はたった2行で
機械学習の精度検証が出来ちゃう
Lazypredictを試してみました

解説動画はこちら


このライブラリは
機械学習用のモデルを自動作成して
複数のモデルを比較してくれます

これがgithubです
Lazypredict

ドキュメントとしては
それほど情報量が多くないようです

コードなどもシンプルで
かなり使いやすい印象ですね


GoogleColabで動かせるので
使いたい方はコードを参考にしてみてください。

まず最初はライブラリのインストールです
# ライブラリのインストール
pip install lazypredict
30秒くらいでインストールも終わります。

GoogleColabなら追加のインストールが
無くても動くと思います。

このライブラリは
数値を予測する回帰モデルと
種別を予測する判別モデル
2種類の機械学習モデルの比較を行えます



最初は判別モデルをみてみましょう
データはscikit-learnのデータセットを使います

load_wine
ワインの品種に関するデータセットで
14列178個のデータがあり
3クラス分類で予測します


説明変数
alcohol アルコール濃度
malic_acid リンゴ酸
ash 灰
alcalinity_of_ash 灰のアルカリ成分
magnesium マグネシウム
total_phenols 総フェノール類量
flavanoids フラボノイド(ポリフェノールらしい)
nonflavanoid_phenols 非フラボノイドフェノール類
proanthocyanins プロアントシアニジン(ポリフェノールの一種らしい)
color_intensity 色の強さ
hue 色合い
od280/od315_of_diluted_wines ワインの希釈度合い
proline プロリン(アミノ酸の一種らしい)

目的変数
ワインの品種

こんな感じのデータです
読み込みのコードはこちら
from sklearn import datasets
import pandas as pd
df = datasets.load_wine(as_frame=True).frame

print('行列数 : ' , df.shape)
print('ターゲットの種別数 : ' , df['target'].nunique())
df.head()

これでデータが用意できたので
次は学習データの分割です
トレーニング7 , テストサイズ3で分割します
# 学習データの分割
from sklearn.model_selection import train_test_split
X = df.iloc[0: , 0:-1]
Y = df['target']

# トレーニング7 , テストサイズ3で分割
x_train, x_test, y_train, y_test = train_test_split(X , Y , test_size=0.3 , random_state=0)
x_train.shape, x_test.shape, y_train.shape, y_test.shape
((124, 13), (54, 13), (124,), (54,))


最後にlazypredictで
予測モデルの作成です

分類モデルを複数自動で生成し
その精度検証の結果と
予測結果を出してくれます

モデルの作成、検証部分は2行でいけます
分類モデルの検証はLazyClassifierを使います
# lazypredictのインポート
import lazypredict
# 回帰予測
#from lazypredict.Supervised import LazyRegressor
# 分類問題
from lazypredict.Supervised import LazyClassifier

# 予測モデルの作成(たったの2行だけ)
clf = LazyClassifier(verbose=1,ignore_warnings=True,predictions=True)
models , predictions = clf.fit(x_train , x_test , y_train , y_test)

最後の行の変数
models , predictions
に精度検証の結果と
予測結果が格納される仕組みです


作成した予測モデルの比較を見てみましょう

# モデルの比較
models
スクリーンショット 2022-10-01 16.01.17

こんな感じで予測モデルを一気に検証してくれます


テストデータの予測結果も見てみましょう
# テストデータ で予測
predictions
スクリーンショット 2022-10-01 16.02.36

列方向は各モデルで
行がテストデータです


回帰モデルも同様に試してみましょう

load_boston
ボストン住宅価格のデータです
from sklearn import datasets
import pandas as pd

data = datasets.load_boston()
boston_df = pd.DataFrame(data=data["data"] , columns=data["feature_names"])
boston_df['MEDV'] = data["target"]

print('行列数 : ' , boston_df.shape)
print('ターゲットの平均値 : ' , boston_df['MEDV'].mean())
boston_df.head()

学習データの分割も同様です
# 学習データの分割
from sklearn.model_selection import train_test_split
X = boston_df.iloc[0: , 0:-1]
Y = boston_df['MEDV']

# トレーニング7 , テストサイズ3で分割
x_train, x_test, y_train, y_test = train_test_split(X , Y , test_size=0.3 , random_state=0)
x_train.shape, x_test.shape, y_train.shape, y_test.shape
回帰モデルの検証も2行でいけますが
回帰の場合はLazyRegressorを使用します

# lazypredictのインポート
import lazypredict
# 回帰予測
from lazypredict.Supervised import LazyRegressor
# 分類問題
#from lazypredict.Supervised import LazyClassifier

# 予測モデルの作成(たったの2行だけ)
reg = LazyRegressor(verbose=1,ignore_warnings=True,predictions=True)
models , predictions = reg.fit(x_train , x_test , y_train , y_test)
# モデルの比較
models
スクリーンショット 2022-10-01 15.42.01

こんな感じの結果になりました



まとめ


データを突っ込めばどの手法の精度が高くなるのかを
結構な速さで出してくれるので
初めて予測モデルを作るデータには
最適かもしれません


AutoMLで似たようなものに
PyCaretというのが有りますが
Lazypredictの方がバグが出なくて
良いかもしれないなーと思いました

検証をパパッとやりたい方には
かなり良いライブラリかと思いますので
試したい方はコードを参考にしていただければと思います

それでは

水曜日のダウンタウンに出てきた
「じゃねーよカルタ」

このカルタに出てきた人の顔
誰が一番春菜さんの顔と近いのかを
調べてみました。


解説動画はこちら



今回は「じゃねーよカルタ」に出てきた人の
顔の画像と近藤春菜さんの顔の画像を
比べて、誰が一番近いのかを検証しました。

画像の類似度の判定には
opencvのAKAZE特徴量を用いて
判定することとします。

さて今回の比較対象はこの5名

download-2

ハロネン元大統領
角野卓造
森永卓郎
和泉節子
マイケル・ムーア監督
です。

どんな感じに比較しているのか
AKAZEを使って特徴点を見てみましょう。

import matplotlib.pyplot as plt
import cv2
import os
%matplotlib inline

img1 = cv2.imread('画像パス') 
img2 = cv2.imread('画像パス') 
gray1 = cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY) 
gray2 = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY) 
akaze = cv2.AKAZE_create() 
kp1, des1 = akaze.detectAndCompute(gray1,None) 
kp2, des2 = akaze.detectAndCompute(gray2,None) 
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
matches = bf.match(des1, des2)
matches = sorted(matches, key = lambda x:x.distance)
img3 = cv2.drawMatches(img1, kp1, img2, kp2, matches[0:10], None, 
                       flags = cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
plt.figure(figsize=(10,10))
plt.imshow(cv2.cvtColor(img3, cv2.COLOR_BGR2RGB))
plt.axis("off")
plt.show()
download

こんな感じで似ている点を出しています。

今回比較する春菜さんの顔はこちら

download-1

先ほどの5名と
和泉節子さん風に変装した春菜さんの
6名で比較して、一番近い顔の人を出してみます。

対象の人の顔画像は
画像ディレクトリに入れています。

判定に使ったコードはこちら
dir_path = '画像ディレクトリ'
img_size = (300,300)
target_img_path = '画像パス'
target_img = cv2.imread(target_img_path, cv2.IMREAD_GRAYSCALE)
target_img = cv2.resize(target_img, img_size)
bf = cv2.BFMatcher(cv2.NORM_HAMMING)
detector = cv2.AKAZE_create()
(target_kp, target_des) = detector.detectAndCompute(target_img, None)

files = os.listdir(dir_path)
result = {}
for file in files:
    img_path = dir_path + file
    try:
        img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
        img = cv2.resize(img, img_size)
        (kp, des) = detector.detectAndCompute(img, None)
        matches = bf.match(target_des, des)
        dist = [m.distance for m in matches]
        ret = sum(dist) / len(dist)
        result[file.replace('.png','')] = ret
    except cv2.error:
        ret = 999999

for k,v in sorted(result.items(),reverse=True,key=lambda x:x[1]):
    img = cv2.imread('img/{0}.png'.format(k)) 
    plt.figure(figsize=(8,8))
    plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    plt.title('{0} : {1:.06}'.format(k , v),fontsize=20)
    plt.axis("off")
    plt.show()


結果は動画の方で
お楽しみくださいませ。

結構意外な結果が出ましたね!!!

opencvを使うと
画像の特徴量を比較して
似ているかどうかを数値化する事ができます。

面白いので試してみてくださいね。
今回はこれまでで
それでは。


先日映画「CUBE 一度入ったら、最後」を観てきました。

20年くらい前の映画のリメイク版ですが
そこではCUBEと呼ばれる巨大な立方体が
描かれていたので、今回はBlenderを使って
それを再現していきたいと思います。

解説動画はこちら



映画の方は
監督は清水康彦、主演は菅田将暉で
1997年に公開されたカナダ映画
『CUBE』のリメイク作品です。

設定上は大量の部屋があるCUBEの中に
閉じ込められた主人公たちが
あれこれしてなんとか
CUBEから出ようとする話です。

流石に立方体はプログラムでは
うまく再現しずらいので
Blenderを使うことにしました。


Blenderは3Dモデリングを行うためのソフトウェアで
最近のバージョンではPythonスクリプトを
使用することができます。

手で作ると非常に大変なモノを
スクリプトでは簡単に作ることができます。

一応無料のソフトウェアなので
インストールしたい方は
こちらをどうぞ


早速Blenderを開いてみましょう。
zengamen

Pythonスクリプトを使うには
画面上部中央にある「Scripting」をクリックして
コンソールを開きます。

script


コンソールでは色々なスクリプトを打ち込んで
Blenderを操作できます。

console



実際にCUBEを生成するスクリプトは
次の通りです。
import bpy  # blenderインポート

# 立方体 
# location:図形の中心座標 
# size:立方体の一辺の長さ 
# rotation:立体の回転角(rad)
num = 25
for x in range(num):
    for y in range(num):
        for z in range(num):
            if any([x==0,y==0,z==0]) :  
                bpy.ops.mesh.primitive_cube_add(location=(x, y, z), size=1, rotation=(0, 0, 0))
こいつをコピペして実行すると
CUBEを生成することができます。

コードの内容ですが
Blenderでスクリプトを使う際は
まずはimport bpyでライブラリを読み込みします。

モノを生成するメソッドなどがあるので
それを実行するとモノが生成されます。

今回はprimitive_cube_addで立方体を
生成しました。

引数としてlocationでx,y,z軸の3方向があるので
そこをうまく変えるようにしています。

実行すると・・・
cubegaihi

こんな感じでCUBEが生成されます。
1部屋を1つの立方体として作っています。

映画のCUBEは25*25*25くらいは
最低でも部屋がある感じでした。

この中の一室が出口につながってるっぽいですが
すでにこの時点で1万部屋を超えているので
探すのは大変ですね。

ちなみにPCではこれだけの数の立方体を
作るのはPCが固まって無理でした。

なので・・・

cubekawa

こんな感じで皮だけのハリボテになってまーす。

外から見る分にはバレない仕様なので
見る角度をうまく調整してごまかして下さい。

リメイク版では
最後、CUBEから出ることが
出来るんでしょうか?!?!?!
それとも
部屋から出れないのか・・・

それについては
映画の方を見ていただければと思います。

今回はここまでです
それでは。


 

                 その先、仕事とか、研究にどう使えるの?




さて
プログラミングの基礎はいかがだったでしょうか?

まだ、ここまでの段階だと
プログラミングでどんなことができるかとか

どんなことに役立つのかとか・・
イメージが湧かない方の方が多いのではないかと思います。

なので、実際に仕事で使っているコードも見ながら
プログラミングがどういうものなのかを
改めて体験していただき、その後どうすれば良いか
というところを深く掘り下げて行きたいと思います。

ファイルの読み込み

In [1]:
# 同じ階層に配置してあるファイルの中身を表示する。
with open('sample.py') as _r:
    print(_r.read())
def hello(aa):
    print(aa)

CSVファイルの読み込み

In [2]:
# 結果を格納する変数を用意
res = []
# ファイルの読み込み
with open('sample.csv') as _r:
    for row in _r:
        # 改行を取り除き、カンマで区切って配列にする
        rows = row.replace('\n','').split(',')
        # 結果用の変数に追加
        res.append(rows)

print(res)
[['aaa', 'bbb', 'ccc'], ['ddd', 'eee', 'fff'], ['hhh', 'iii', 'jjj'], ['kkk', 'lll', 'mmm']]
In [3]:
for row in res:
    # タブ区切りで表示
    print('\t'.join(row))
aaa	bbb	ccc
ddd	eee	fff
hhh	iii	jjj
kkk	lll	mmm

webサイトへアクセスして情報取得

In [4]:
import requests

# webサイトへアクセスしてデータを取得
html = requests.get('http://yahoo.co.jp')

# 取得したデータの最初の800文字を表示
print(html.content.decode('utf-8')[0:800])
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta http-equiv="content-style-type" content="text/css">
<meta http-equiv="content-script-type" content="text/javascript">
<meta name="description" content="日本最大級のポータルサイト。検索、オークション、ニュース、メール、コミュニティ、ショッピング、など80以上のサービスを展開。あなたの生活をより豊かにする「ライフ・エンジン」を目指していきます。">
<meta name="robots" content="noodp">
<meta name="google-site-verification" content="fsLMOiigp5fIpCDMEVodQnQC7jIY1K3UXW5QkQcBmVs">
<link rel="canonical" href="https://www.yahoo.co.jp/" />
<link rel="alternate" media="only screen and (max-width: 640px)" href="https://m.yahoo.co.jp/">
<link rel="alternate" href="android-app://jp.co.yahoo.android.yjtop/yahooja

機会学習系のライブラリの利用

In [5]:
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
In [6]:
# データフレームの作成
df = pd.DataFrame([[3,4],[4,5],[6,9],[2,8]],columns=['a','b'])
# データフレームを描画
df.plot()
Out[6]:
<matplotlib.axes._subplots.AxesSubplot at 0x10eed5f28>
In [7]:
df = pd.DataFrame([[3,4],[4,5],[6,9],[2,8]],columns=['1','2'])
# 散布図を描画
plt.scatter(df['1'],df['2'])
Out[7]:
<matplotlib.collections.PathCollection at 0x1122ec438>

scikit learn

In [8]:
import pandas as pd
# 必要なライブラリのインポート
from sklearn import datasets, model_selection, svm, metrics

# 有名なアヤメのデータの読み込み
iris = datasets.load_iris()
In [9]:
# アヤメのデータをデータフレームに変換する。
iris_data = pd.DataFrame(data=iris.data, columns=iris.feature_names)
# 5行だけ表示
iris_data.head()
Out[9]:
sepal length (cm)sepal width (cm)petal length (cm)petal width (cm)
05.13.51.40.2
14.93.01.40.2
24.73.21.30.2
34.63.11.50.2
45.03.61.40.2
In [10]:
# ラベルデータの読み込み
iris_label = pd.Series(data=iris.target)
# 5行だけ表示
iris_label.head()
Out[10]:
0    0
1    0
2    0
3    0
4    0
dtype: int64
In [11]:
# アヤメのデータを訓練データ、テストデータ、訓練ラベル、テストラベルに分ける。
train_data, test_data, train_label, test_label = model_selection.train_test_split(iris_data, iris_label)
In [12]:
# 訓練データ
train_data.head()
Out[12]:
sepal length (cm)sepal width (cm)petal length (cm)petal width (cm)
705.93.24.81.8
1257.23.26.01.8
776.73.05.01.7
255.03.01.60.2
516.43.24.51.5
In [13]:
# 訓練ラベル
train_label.head()
Out[13]:
70     1
125    2
77     1
25     0
51     1
dtype: int64
In [14]:
#  訓練データとテストデータの個数
print(len(train_data), '\t',  len(test_data))
112 	 38
In [15]:
# SVM学習器の定義
clf = svm.SVC()

# 訓練データで学習
clf.fit(train_data, train_label)

# テストデータで予測
pre = clf.predict(test_data)

print(type(pre))
print(pre)
<class 'numpy.ndarray'>
[0 0 1 1 0 2 1 0 2 1 2 0 2 2 0 1 0 0 2 1 0 0 0 2 0 2 2 2 1 0 2 0 1 2 2 1 0
 1]
In [16]:
# 正答率
ac_score = metrics.accuracy_score(test_label, pre)
print(ac_score)
0.947368421053

最後に

プログラムを作る上で重要になるのが

「目的」です。

プログラミングの重要な部分は
プログラムに何をさせるかということです。

プログラムは手段であり、目的を達成するために
労力を下げるためのものになります。

プログラムを作る労力が目的を達成する時間を
上回っていたらプログラムを作る必要性はなくなります。

まずは目的を明確にして、ものすごく労力のかかる作業であれば
これをプログラムに落とし込む、ということを考えましょう。

すでに同じ機能を有するプログラムが存在していたら
実はプログラムを作る必要性というのは低いです。

こういうのを車輪の再発明といい、すでに有るものを再度作ろうと
試みるのは、無駄なことが多いです。

pythonでは大量のライブラリがあり
ほとんどの機能はそれで実現できると思います。

なので、プログラムを作る際に無駄なことをしないように、
下調べをしておくのも作業時間を減らす良い方法になります。

あくまでもプログラミングは目的を達成するための手段でしかありません。

恐らく仕事で使えるのは、「問題を解決する能力」の方だと思います。

プログラミングを続けると、
自然とこの「問題を解決する能力」が高まります。

この先は恐らくエラーが多発し、それを回避するために、
いろいろ調べたり、人に聞いたりしながら、コードを修正してゆくこととなるでしょう。

そういった経験の積み重ねが、研究や仕事をこなすための能力を高めてくれることでしょう。

この講座を学習したことが、みなさまの能力向上に一役買って頂けてると
とても幸いです。

pythonの基礎編は以上になりますが、この後は応用編や、
他の言語やミドルウェアや、クラウドサービスの使い方などの
講座も続けていきますので、ぜひそちらもチェックしてみてください。

このページのトップヘ