1031 - MNIST

오늘·2022년 11월 1일
0

A

목록 보기
46/46

복습문제

# text만 뽑아내려 합니다. 빈칸을 완성해주세요
# soup.select('dl.mileage_section1 > dd > span')(_)
text, string, get_text()



e = driver.find_elements(By.CLASS_NAME, 'input_text')
id = 'princess'
pw = 'passwd'
e.clear()
# 키를 보내세요
e[0].clear()
e[0].send_keys(id)
e[1].clear()
e[1].send_keys(pw)



import requests
from bs4 import BeautifulSoup

url = "https://ko.wikipedia.org/wiki/%EB%8C%80%ED%95%9C%EB%AF%BC%EA%B5%AD%EC%9D%98_%EB%8C%80%ED%86%B5%EB%A0%B9_%EB%AA%A9%EB%A1%9D"
html =requests.get(url).text # 네이버
soup = BeautifulSoup(html, 'html.parser')
names = soup.select('td:nth-child(3) > b > a') 
# 원하는 것보다 더 적은 결과값과 작은 출력값이 나왔다. 범위를 넓혀봐라
td > b > a와 같이 td를 좀 더 포괄적으로 지정해줘도 되고,
td > b 와 같이 조금 더 넓은 범위를 지정해줘도 되고 그러는거 아닌가. 뭘 원하는 문제지



# 구글에 검색창에 코리아를 넣고 자동검색하세요
import selenium
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome("./chromedriver.exe")

url = f"http://google.com"
driver.get(url)
driver.implicitly_wait(20)

driver.find_element(By.NAME,'q').send_keys("코리아")
driver.find_element(By.XPATH, '/html/body/div[1]/div[3]/form/div[1]/div[1]/div[1]/div/div[2]/input').send_keys(Keys.ENTER)



# 로그인과 메일 발송을 한번에 하는 프로그램을 작성하려 한다.
# RPA 프로그램을 작성하려 한다. 아래 질문에 답하시오
import selenium
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome("./chromedriver.exe")
url = f"http://naver.com"
driver.get(url)
driver.implicitly_wait(20)

# 로그인에 페이지 접근 하세요
elem = driver.find_element(By.CLASS_NAME,'link_login')
elem.click()

# 로그인하세요
user_id = '아이디'
user_qw = '비밀번호'
driver.find_delement(By.id, 'id').send_keys(user_id)
driver.find_delement(By.id, 'id').send_keys(user_qw)
driver.find_element(By.XPATH, '//*[@id="log.login"]').send_keys(Keys.ENTER)

# 메일에 접근하세요
driver.find_element(By.CLASS_NAME, "nav").click() 
# 메일 쓰기에 접근하세요
driver.find_element(By.CLASS_NAME, 'btn_quickwrite').click()

from datetime import datetime
datetime = datetime.now().strftime('%Y-%m-%d')

# 메일 작성
toInput = "cyhse7@gmail.com"
subject = f"{datetime} 문제제출입니다 test"
textara = "집가고 싶다"

mail_input = driver.find_element(By.ID, 'toInput')
mail_input.clear()
mail_input.send_keys(toInput)

mail_subject = driver.find_element(By.XPATH, '//*[@id="subject"]')
mail_subject.clear()
mail_subject.send_keys(subject)

## iframe안으로 들어가기
## switch_to.frame('id 혹은 name')
driver.switch_to.frame('se2_iframe')
mail_text = driver.find_element(By.CSS_SELECTOR, 'body')
mail_text.clear()
mail_text.send_keys(textara)
## 빠져나오기(상위로 이동)
driver.switch_to.default_content()

# 메일 보내기
driver.find_element(By.ID, 'sendBtn').click() 

mnist 데이터셋 사용

MNIST는 간단한 컴퓨터 비전 데이터 세트로, 손으로 쓰여진 숫자 이미지들로 구성되어 있으며, 총 60,000개의 데이타가 있다.

from sklearn.datasets import fetch_openml


# 데이터 불러오기
mnist = fetch_openml('mnist_784')

# 변수에 할당하기
X = mnist.data
y = mnist.target

# 데이터 모양 확인
X.shape
(70000, 784)
mnist.keys()
dict_keys(['data', 'target', 'frame', 'categories', 'feature_names', 'target_names', 'DESCR', 'details', 'url'])

이미지의 모양을 확인하려 한다. 이때 책에서는 X[0]의 형태로 확인 할 수 있다 하지만, 이건 numpy 형태일 때의 접근 방법이다. 현재 받아온 mnist데이터의 X 형태는 DataFrame이다.

따라서 책과 같은 모양을 확인하기 위해서는 numpy형태로 바꿔주는 것이 좋다.

X.to_numpy()[0]

import matplotlib as mpl
import matplotlib.pyplot as plt

test_pic = X.to_numpy()[0].reshape(28, 28)

plt.imshow(test_pic, cmap="binary")
plt.axis('off')
plt.show()

y 레이블은 현재 문자형으로 되어있다. int형으로 변환해준 후 데이터 셋을 6:1 비율로 (train, test) split 시켜준다

import numpy as np
y = y.astype(np.uint8)

X_train, X_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:]

이진 분류를 해보기 위해 5는 true, 다른 숫자들은 false인 데이터 만들기

y_train_5 = (y_train == 5) # 5는 True, 다른 숫자는 모두 False
y_test_5 = (y_test == 5)

y_train_5.value_counts()
False    54579
True      5421
Name: class, dtype: int64

model 학습 시켜주기

from sklearn.linear_model import SGDClassifier

sgd_clf  = SGDClassifier(random_state = 42)
sgd_clf.fit(X_train, y_train_5)
SGDClassifier(random_state=42)

StratifiedKFold를 3fold로 돌려주기

아래 코드는 책과는 다른 점이 있다. 위에서 언급했든 현재 X데이터는 DataFrame형식임을 기억하자.

from sklearn.model_selection import StratifiedKFold
from sklearn.base import clone

# skfolds = StratifiedKFold(n_splits=3, random_state = 42)
# Setting a random_state has no effect since shuffle is False. You should leave random_state to its default (None), or set shuffle=True.
# StratifiedKFold 매개변수에서 random_state는 shuffle과 관련된 매개변수다. 
# 그래서 shuffle이 False인데 random_state를 지정하면 위와 같은 오류
skfolds = StratifiedKFold(n_splits=3, shuffle=True, random_state = 42)

for train_index, test_index in skfolds.split(X_train, y_train_5):
  clone_clf = clone(sgd_clf)
  X_train_folds = X_train.loc[train_index]
  y_train_folds = y_train_5.loc[train_index]
  X_test_fold = X_train.loc[test_index]
  y_test_fold = y_train_5.loc[test_index]

  clone_clf.fit(X_train_folds, y_train_folds)
  y_pred = clone_clf.predict(X_test_fold)
  n_correct = sum(y_pred == y_test_fold)
  print(n_correct / len(y_pred))
0.9669
0.91625
0.96785

중간에 적었듯 Setting a random_state has no effect since shuffle is False. You should leave random_state to its default (None), or set shuffle=True. 이런 오류가 나는 경우 오류를 자세히 보면 알겠지만 shuffle에 대한 문제이다. random_state를 지정했다면 shuffle을 True로 켜줘야 한다.

cross_val_score

from sklearn.model_selection import cross_val_score

cross_val_score(sgd_clf, X_train, y_train_5, cv = 3, scoring = "accuracy")

0개의 댓글