인공지능/머신러닝

붓꽃 데이터 (iris.csv) 분석하기 / 가우시안 나이브베이즈

해피밀세트 2020. 5. 13. 13:43

 

 

 

붓꽃데이터 (iris.csv) 설명

SepalLength : 꽃받침의 길이

SepalWidth : 꽃받침의 

PetalLength : 꽃잎의 길이

PetalWidth : 꽃잎의 

Name : 붓꽃의 종류

  • Iris-setosa
  • Iris-versicolor
  • Iris-virginica

 


 

1. R + kNN

 

# 데이터 불러오기

iris <- read.csv("C:/data/iris.csv", header=T, stringsAsFactors=F)

# 데이터 구조 확인

str(iris)    

# 데이터셋 나누기
# training set(67%): test set(33%)
# set.seed() : 난수값 고정하기

set.seed(1234)

iris_sample <- sample(2,NROW(iris),replace=T,prob=c(0.67,0.33))

prop.table(table(iris_sample))

iris_training <- iris[iris_sample==1,1:4]

iris_training_label <- iris[iris_sample==1,5]

 

iris_test <- iris[iris_sample==2,1:4]

iris_test_label <- iris[iris_sample==2,5]

 

 

# 훈련 / 예측

library(class)

iris_model <- knn(iris_training,iris_test,iris_training_label,k=3)

iris_model

# 비교로 정확도 분석

library(gmodels)

CrossTable(x=iris_test_label,y=iris_model,

           prop.chisq = F)

# 모델에 새로운 데이터 넣어보기

iris_test <- data.frame(SepalLength=c(2.0,6.7),

                        SepalWidth=c(7.0,3.1),

                        PetalLength=c(1.0,4.4),

                        PetalWidth=c(0.1,1.4))

iris_model <- knn(iris_training,iris_test,iris_training_label,k=3)

iris_model

 


 

2. 파이썬 + 가우시안 나이브베이즈

 

가우시안 나이브베이즈

  • 컬럼들의 값들이 정규분포(가우시안 분포) 있다는 가정하에 조건부 확률을 계산하며, 연속적인 성질이 있는 데이터를 분류하는데 적합하다.

 

# 필요한 라이브러리 불러오기

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB

 

# 데이터 불러오기 / 데이터 확인

df = pd.read_csv("C:/data/iris.csv")
df.info()
df.head()

# 빈도수 체크

df.Name.value_counts()

# Iris-setosa 분포 그림으로 그리기

setosa_df = df[df.Name == 'Iris-setosa']
ax = setosa_df["SepalLength"].plot(kind='hist')
setosa_df["SepalLength"].plot(kind='kde', ax=ax, secondary_y=True, figsize=(8,4))

 

# 데이터 분리

X_train,X_test,Y_train,Y_test = train_test_split(df.iloc[:,0:4],df['Name'],test_size=0.2)

 

# 인스턴스 만들기

model = GaussianNB()

 
# 훈련하기

model.fit(X_train,Y_train)

 
# 예측하기

predict = model.predict(X_test)

# 혼동행렬 만들기

from sklearn import metrics

print(metrics.classification_report(Y_test,predict))

# 새로운 데이터 예측

iris_test = pd.DataFrame({'SepalLength':[2.0,6.7],

                        'SepalWidth':[7.0,3.1],

                        'PetalLength':[1.0,4.4],

                        'PetalWidth':[0.1,1.4]})

predict = model.predict(iris_test)

predict

# 하나의 데이터만 넣고 싶을때(하나의 행, 모든 열)

import numpy as np

model.predict(np.array([2.0,7.0,1.0,0.1]).reshape(1,-1)) # reshape(1,4) # -1:모든것

model.predict(np.array(iris_test.iloc[1,]).reshape(1,-1))

 


 

3. 파이썬 + kNN

 

# 필요한 라이브러리 불러오기

import pandas as pd
from collections import Counter
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score, classification_report

 
# 데이터 불러오기 / 구조 확인

iris = pd.read_csv("C:/data/iris.csv")
str(iris)

# 데이터셋 분리하기

X=iris.iloc[:,:4]
Y=iris.iloc[:,4]
X_train,X_test,Y_train,Y_test = train_test_split(X,Y,test_size=0.2)

 
# kNN 분류

clf = KNeighborsClassifier(n_neighbors=21)
 
# 학습

clf.fit(X_train,Y_train)
# 예측

clf.predict(X_test)
# 정확도 분석

clf.score(X_test,Y_test)
accuracy_score(Y_test,clf.predict(X_test))

# crosstab 보기

pd.crosstab(Y_test,clf.predict(X_test))
# 리포트 보기

print(classification_report(Y_test,clf.predict(X_test)))

# 새로운 데이터 넣고 예측

clf.predict(np.array([6.9,3.1,5.1,2.3]).reshape(-1,4))
clf.predict(np.array([5.1,3.5,1.4,0.2]).reshape(-1,4))[0]

반응형