IOT:python requestsモジュールを使ってみる

こんにちは Keita_Nakamori(´・ω・`)です。

今日は python urllib.requetsモジュールに続きまして requestsモジュールを使ってみようと思います。名称がとても似ていますが別物です。

前回のurllib.requestがpython標準モジュールであるのに対して、
今回のrequestsモジュールは標準ではなく、より使いやすく改良されています。
エンコードなども自動でやってくれるので、こちらのほうが圧倒的に人気があります。

JSONをディクショナリで取り出すときは requests.json() があるので jsonモジュールも不要です。

IT用語 予備知識

HTTPステータスコード

HTTPにおいてWebサーバからのレスポンスの意味を表現する3桁の数字からなるコードです。例えば、200はリクエストに対して正常にレスポンスが得られたという意味になります。

requestsモジュール

GET

POST

PUT

DELETE

 

 

IOT:python urllib.request を使ってみる

こんちには Keita_Nakamoriです。

Python標準モジュールのurllibを使ってHTTPメソドを実行してみましょう。

IT用語 (予備知識として)

HTTPメソド

クライアントからサーバーに命令をする具体的なやり方のことです。

基本の4つの操作
GET:データを参照する
POST:データを新規登録する(パスワードを見えないように送るとき)
PUT:データを更新する
DELETE:データを削除する

その他 HEAD OPTIONS TRACE PATCH LINK UNLINK と色々あります。

REST

-REpresentational State Transfer

”表現文の転送”ということでしょうか。Webサービスに対してデータをやり取りする際の取り決め、というかコンセプトです。

RESTに従ったWebサービスは、HTTPメソドの形式でアクセスすることでデータの送受信を行えます。

REST APIという形でまとまっているWebサービスが多いので利用できます。

パケット通信

音声通話のように回線を占有するのではなく、
データを小さな単位に分割して送受信することで
複数のユーザーで同じ回線をシェアできる方法です。

送信されたデータは交換機の記憶メディアに一時的に蓄積されるので
相手の通信環境が悪くても、復帰したときにデータを受信できます。

ペイロード

パケット通信においてパケットに含まれるヘッダやトレーラなどの付加的情報を除いたデータ本体のことです。

パケットにはデータの転送先や転送経路などを制御するための情報を含むヘッダや、データの破損などを検査するトレーラなどの情報が、データそのもののほかに付加されて送られて来ます。

ペイロードは、こうした情報を対象に含めず、ユーザーが送信したいデータそのものを指し示す際に用いられます。

urllibモジュール

基本的な GET

パラメータを含んだGET

パラメータが見えないようにするPOST

PUT

DELETE

ここで、HTTPError: HTTP Error 405: METHOD NOT ALLOWED とエラーになりました。DELETEは用意されていないようです。

IOT:socket通信の超基本

socket 使っていきましょう。

socket通信とは

Socket通信とは複数のコンピュータが、ネットワークを介してデータをやりとるする時に用いる通信規格の一種です。

今お使いのPCをサーバーにして、同PCをクライアントとしローカルホスト接続してみましょう。

 

サーバー側

まず、サーバー側のスクリプトから起動します。

実行すると、クライアントからのデータ待ち状態になります。

出力:

サーバーはポートNO. 2000 にバインドされました

サーバーはクライアントをリスニング中です

クライアント側

クライアント側のスクリプトを実行して、サーバーへデータを送りましょう

出力:

サーバーへ接続しました
サーバーへデータを送信しました

サーバー側 再び

サーバー側がクライアントからのデータを受け取りました。

直後に、クライアントに対して受信の通知をします。

出力:

クライアントのアドレスを受信しました : (‘127.0.0.1’, 52256)
クライアントからのデータを受信しました : こんにちはサーバーさん。私はクライアントです
コネクションは閉じられました
サーバーソケットは閉じられました

クライアント側 再び

サーバーから送られてきた受信の通知を受け取りました。

出力:

サーバーからの受信確認が返ってきました : サーバーです。データをしっかり受け取りました

クライアントソケットを閉じました

課題

このスクリプトでは、送受信がシーケンスになっており厳密には同時ではありません。

同時にする仕組みとして、マルチスレッディングというのがありますので、次回やってみましょう。

Python:スタティックメソド @staticmethod

前回のクラスメソド @classmethod に続きましてスタティックメソド @staticmethonです。前回のを見てから、その流れでこちらを見ることをおすすめします。

こちらもまた、クラスをオブジェクト化していない場合に対するpythonの便利?機能です。

(1) @staticmethodをメソドの前行につけます。引数にselfは不要です。

(2) このメソドはクラスの外に丸ごと出してしまっても全く問題ありませんが、@staticmethodとしてクラスの内部に書くことによって、クラスPersonの仲間なんだよという意思を表現することができます。

ぶっちゃけ、あんまり使おうとは思いませんが、色々な人のスクリプトを見ていると、出てきますので覚えた次第であります。

 

Python: クラスメソド @classmethod

クラスメソドをやっていきましょう。

普通のクラスと使い方

インスタンス(オブジェクト)を作るときに、カッコを付けるのが普通ですが、カッコをつけない場合は、アトリビュートにアクセスできなくなります。

オブジェクト内のグローバル変数的な意味合いのある”クラス変数”にはアクセスできます。

 

本題:クラスメソド @classmethod

 

カッコをつけてオブジェクト化していなくても、アトリビュートにアクセスできるようにクラスメソドを使います。

やり方:

(1)メソドの前行に @classmethod とマーキングする。

(2)メソドの引数self を clsに変更する。cls = classの意味

kenji3はクラスのままでオブジェクト化されていませんが、@classmethodでマーキングしたメソドはちゃんと使えるようになりました。

次回はスタティックメソド @staticmethod をやってみます。

Python:デコレータ関数で機能追加

今日はデコレータをやっていきます。

既存のプログラムを使用しているときに、ちょっとこの関数に機能を追加したいなあ、なんて思ったことありませんか?

デコレータ追加前

引数xと引数yを足した数値を返す機能を”基本機能”と呼びましょう。

これに、機能を追加(デコレート)していきましょう。

デコレーターを使わない場合

その前に、このスクリプトに対して単純に機能を追加するならば下記のようになりますよね。print()という機能をresultを算出する前後に追加しました。

しかし、これではadd_numするたびに毎回print()→add_num→print()と3行書かなくてはなりません。

デコレータを使った場合

ここでデコレータの出番です。

デコレータの動きを解説

まず、通常の関数定義 def add_num(x, y): の前行に @deco とつけます。

このdecoという名称が、これから作る追加機能(デコレータ)の名称になります。(任意の名前で結構です)

@decoの前行に デコレータ関数定義 def deco(func):をします。

このdef decoの引数funcには、関数add_num実行時に@decoで指定されているので、add_numが入ってきます。

デコレータ関数decoはwrapperというものをreturnするようにしますが、このwrapperを デコレータ関数内のインナー関数として定義します。def wrapper():

引数にはタプルでもディクショナリでもどちらでも入るように、def wrapper(*args, **kwargs):にしておきます。

この中に、下記3行を書き実行します。この前後print文が今回追加した(デコレートした)機能です。ここのfuncの引数にも、入ってきた引数が何であれ全て受け入れます。つまり、そのまま返すということです。

print(‘関数実行の前に、何かの処理:足し算しますよー’)
result = func(*args, **kwargs)
print(‘関数実行の後に、何かの処理:終わりましたよー’)

これで、デコレータ関数の作成はおわりました。

実行

実行するときは

r=add_num(100,200)
print(r)

とすれば、add_numの基本機能の他にデコレータの追加機能も合わせて処理が行われます。

【実行結果】

  • 関数実行の前に、何かの処理:足し算しますよー #デコレータによる追加機能
  • 関数実行の後に、何かの処理:終わりましたよー #デコレータによる追加機能
  • 300  #基本機能

機械学習:Scikit-Learn ボストンデータを良く眺めてみる。ついでにKNNの回帰をやる。

Keita_Nakamoriです。

今回は、ボストンの住宅のデータを眺めて行こうと思います。

ついでにKNNの回帰を試していこうと思います。(前回はKNNの分類でした)

モジュール

ボストンデータをロード

どういうことに使えるでしょうか?

  1. このデータから回帰を行う(学習する)
  2. 以降、”特徴量を持つ新規データ”が入ってきたら、その住宅の価格を予測する。理論価格と呼ぶ
  3. 理論価格より、新規データの価格が10%安ければ買いの判断をする

どんな機械学習アルゴリズムが良いでしょうか

多次元の回帰系ですから、KNN-Regressorをやってみましょう。 だめだったら他のやつを探してみます。

  • data とtargetの形を確認しましょう
  • 訓練用データと検証用データに分割しましょう

特徴量について featrue_namesを確認しましょう

英語を日本語へ翻訳する方法

前述のようなドキュメントを調べるとき、対象とする分野、業界の用語が列挙されると、そこそこ英語ができても単語の意味がわかりません。

そんなときは逆にチャンスで、ドキュメントをまるごと、google翻訳にかけると、専門用語を英語と日本語で一気に覚えることができます。

私は常に躊躇することなくgoogle翻訳します。

念の為

#アンパックの順番を良く間違うので念の為確認

#データフレーム化してデータを眺めてみる

スキャッターマトリクスを眺めてみる

今回もデカイです。

訓練開始

一瞬過ぎて何事も起こってないようですが、ちゃんと計算できています

予測

スクリーニングしてみる

20%以上安い物件の数

22件あるんですね。

この22件について、実際に不動産の知識を持って調査すると良いのではないでしょうか。

課題:精度の算出 と 可視化

精度を検証しようとknn.score(X_test,y_test)したところ、0.4616380924610112 と出ましたが、これは一体なんでしょうw

分類と違って、回帰ですから、%ってわけでもないですし・・・ あとで、もう少し考えてみましょう。今は保留。

また、可視化については、回帰ですから、回帰直線みたいなのを引きたいのですが、このような高次元に対しての回帰直線はどのように書いたら良いのでしょうか。今後の課題といたします。

以上、でした。

機械学習:Scikit-learn ブレストキャンサーデータを良く眺めてみる。ついでにKNNをやる。

こんにちはKeita_Nakamoriです。

今日はブレストキャンサーデータを良く眺めてみようと思います。

データをロードしてキーを確認しましょう。

 

キーを指定してデータの内容を確認しましょう

 

おまけ

np.bincount()を使うと 順番に[0の数 , 1の数 , 2の数,・・・]というようなベクトルが得られる

 

勢い余って、KNNをやってしまおう

おわりに

ということで、たったこれだけで、92%の正解率が得られました。

これは、データがしっかり整っているからできることです。

実際に自分自身の課題に対して機械学習を適用しようとすると、データを収集してきれいに整えることにエネルギーを費やすのだと思います。

番外:データフレームとスキャッターマトリクスを眺めてみる

データ数と特徴量が多すぎて、すごいことになっています。

うわ~~~~~ (*´﹃`*)

 

 

機械学習:Scikit-learn アイリスデータでk-最近傍法をやってみる

Keita_Nakamoriです。

前回、アイリスデータの内容を確認しました。

今回は、機械学習で最も単純と思われるk-最近傍法をやっていきます。

  • 必要なモジュールをインポート
  • データをロードして、入力データと出力データを定義

トレインデータ(訓練用)とテストデータ(検証用)に分割する

# データはランダムに振り分けるが,固定し、0という番号を付ける。

X_train のデータをデータフレーム化して、内容を確認する

columns=iris_dataset[“feature_names”] #データフレームの列名を定義
df=pd.DataFrame(X_train,columns=columns)
df[:5]

X_train のデータフレームをpd.plotting.scatter_matrix()で可視化して眺める。

 k- 最近傍法分類 をやってみる

モデルの作成とトレーニング

予測する

予測性能の評価

結果:0.9736842105263158

または、

でもいいです。

機械学習:Scikit-learn アイリスデータを良く見る

Keita_Nakamoriです。

今日はsklearnのアイリスデータを良く見てみようと思います。

インストール

>pip install sklearn

して

Requirement already satisfied: sklearn in c:\users\omoiy\anaconda3\lib\site-packages (0.0)
Requirement already satisfied: scikit-learn in c:\users\omoiy\anaconda3\lib\site-packages (from sklearn) (0.19.1)

と出るので、すでに入っていました。アナコンダですから。

インポートそしてインスタンス作成

アイリスデータが入っている、ロードアイリスをsklearn.datastetsからインポートします。
from sklearn.datasets import load_iris

関数としてロードアイリスのインスタンス、アイリスデータセットを作成します。

iris_dataset=load_iris #ロードアイリス関数

では、アイリスデータセットを見てみましょう。

iris_dataset()

わけのわからないデータの羅列が出てきますが、よく見るとディクショナリによく似た”Bunchクラス”という形式でデータが入っています。

ディクショナリと同様に、キーとバリューを指定できます。

iris_dataset().keys()

キーを指定してみます。長いので500文字で切りましょう。DESCRはディスクドライブの略です。

まずは、データの概要を見る

iris_dataset[“DESCR”][:500]

または、下のように書くと、見やすくなります。

print(iris_dataset()[“DESCR”][:500]+”\n…”)

データセットの特性

インスタンス数:150 (3クラスあり、それぞれ50個)

アトリビュートの数:

4つの予測用アトリビュート(数値)

  • sepal長さ[cm] sepal 幅 [cm]
  • petal長さ[cm] petal 幅 [cm]

クラス(分類)

  • Iris-Setosa
  • Iris- Versicolour
  • Iris-Virginica

訓練用のインプット”データ”を確認する。

iris_dataset()[“data”]

.shape()で大きさを確認すると(150, 4)。4つの予測用アトリビュートをもった塊が150個ある。

正解である”ターゲット”を確認する

iris_dataset()[“target”]

  • 0=Iris-Setosa
  • 1=Iris- Versicolour
  • 2=Iris-Virginica

なのでしょう、きっと。

ターゲットの名前

iris_dataset()[“target_names”]

ここで出てきました。分類名。前述で予想した通りの順番でした。

特徴の名称を確認する

これも、DESCRでの記述順通りでした。

以上、ロードアイリスのデータでした。

次回は訓練させていきます。