見出し画像

python学習note #1

pythonで遊ぶためにちょっとした勉強noteです。本当にただの自己満足noteとなっております。アヤメの品種分類のテストコードを切り崩していきます。

アヤメの品種csvデータ

本文

from sklearn import svm, metrics
import random, re #あやめのCSVデータを読み込む 
csv = []
with open('iris.csv.webarchive', 'r', encoding='utf-8') as fp:
   #一行ずつ読む 
   for line in fp:
       line = line.strip()
       cols = line.split(',')
       
       fn = lambda n : float(n) if re.match(r'^[0-9\.]+$', n) else n
       cols = list(map(fn, cols))
       csv.append(cols) #先頭のヘッダー行を削除 
del csv[0] #データをシャッフル 
random.shuffle(csv) #学習用とテスト用に分割する 
total_len = len(csv)
train_len = int(total_len * 2 / 3)
train_data = []
train_label = []
test_data = []
test_label = []
for i in range(total_len):
   data = csv[i][0:4]
   label = csv[i][4]
   if i < train_len:
       train_data.append(data)
       train_label.append(label)
   else:
       test_data.append(data)
       test_label.append(label) #データを学習し 、予測する
clf = svm.SVC()
clf.fit(train_data, train_label)
pre = clf.predict(test_data) #正答率を求める 
ac_score = metrics.accuracy_score(test_label, pre)
print("正答率=", ac_score)

というかそもそもpythonをそんなにやってないので、結構基本から崩していきます。(for文も危ういのでその辺もご了承ください)

機械学習のライブラリ(scikit-learn)を使います。


from sklearn import svm, metrics

from OO import OOは
from モジュール import オブジェクトの形で

モジュールの特定のオブジェクトだけをインポートすることができる。(便利)

import random, re

この辺は randomとreをimportしているみたい

random...ランダムモジュール
re...正規表現モジュール

reはよくある、扱い易くデータを正規化するモジュールってことかな


csv = []

空のリストを作っている、pythonは複数のデータを管理するデータ型があって

リスト...要素に順序あり、変更可能
タプル...要素に順序なし、変更不可能
辞書...ハッシュ表みたいな感じ
集合...順序がなく、インデックスによる要素指定ができない


with open('iris.csv', 'r', encoding='utf-8') as fp:

ここでなぜかバグり

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd1 in position 8: invalid continuation byte

エラーしました。
参照したcsvファイルが悪いみたいで、大人しくcsvデータに.webarchive拡張子をつけたら解決しました。↓解決方法

with open('iris.csv.webarchive', 'r', encoding='utf-8') as fp:

参考サイト(テラテイルはやっぱり便利)↓

with構文はファイル読み込みを簡単にする構文で、普通は

ファイルのオープン→ファイルの読み込み→ファイルのクローズを上のように簡単に書き表せるようになる

open関数は open('読み込むファイル名', 'モード設定')のように設定できる


for文でファイルを読み込んでいく

for line in fp:
       line = line.strip()
       cols = line.split(',')
       fn = lambda n : float(n) if re.match(r'^[0-9\.]+$', n) else n
       cols = list(map(fn, cols))
       csv.append(cols)

for文もjavaとかなり違くて驚くが基本は
for  変数 in  繰り返したいデータ群 の流れで記述し実行できる

残りはファイルを読み取り、扱いやすいように文字列データを数値データに変更して一覧にまとめていく作業

.strip()...文字、空白の消去

.split()...文字列の分割ができる

.append()...リストの中に要素を追加する

 #先頭のヘッダー行を削除 
del csv[0]
 #データをシャッフル 
random.shuffle(csv)

randomオブジェクトを使う。結構いろんなランダムを作ることができるみたい


total_len = len(csv)
train_len = int(total_len * 2 / 3)
train_data = []
train_label = []
test_data = []
test_label = []
for i in range(total_len):
   data = csv[i][0:4]
   label = csv[i][4]
   if i < train_len:
       train_data.append(data)
       train_label.append(label)
   else:
       test_data.append(data)
       test_label.append(label)

データを分割して学習用とテスト用に分ける作業↑

データを学習、予測

clf = svm.SVC()
clf.fit(train_data, train_label)
pre = clf.predict(test_data)

識別器の学習のテンプレ
pre〜の部分はテストデータの推定をしてる部分(生徒が答えを書いてる状態)

正答率を求める

ac_score = metrics.accuracy_score(test_label, pre)
print("正答率=", ac_score)

metrics.accuracy_scoreは要は生徒が書いた答案と回答を見比べてどれくらいの正答率かどうかを調べる関数

調べてみると混同行列で返してデータ解析するものとかもあるようだ

結果

正答率= 0.96

高い確率で品種分析が成功しているようだ()

この記事が気に入ったらサポートをしてみませんか?