Study/class note
머신러닝 / R 로 신경망 모델 만들기(분류), 파이썬으로 신경망 모델 만들기(분류)
chanzae
2022. 2. 22. 16:55
68 R 로 신경망 모델 만들기(분류)
와인의 등급을 분류하는 신경망
#1. 데이터 로드
#2. 결측치 확인
#3. 정규화 진행
#4. 훈련데이터와 테스트 데이터 분리
#5. 모델 설정
#6. 모델 훈련
#7. 테스트 데이터 예측
#8. 모델 평가
#9. 모델 성능 개선
#1. 데이터 로드
wine <- read.csv("c:\\data\\wine.csv", stringsAsFactors = T)
unique(wine$Type)
#2. 결측치 확인
colSums(is.na(wine))
#3. 정규화
normalize <- function(x){ return( (x - min(x)) / (max(x) - min(x)) ) }
wine_norm <- as.data.frame(lapply(wine[,-1], normalize))
summary(wine_norm)
wine2 <- cbind(Type = wine$Type, wine_norm) #label은 문자형이라서 정규화를 안했었음
head(wine2)
#4. 훈련데이터, 테스트 데이터 분리
library(caret)
set.seed(1)
k <- createDataPartition(wine2$Type, p = 0.9, list = FALSE)
train_data <- wine2[k,]
test_data <- wine2[-k,]
nrow(train_data) #162
nrow(test_data) #16
#5. 모델 설정
install.packages("nnet") #분류를 위한 신경망 모델
library(nnet)
#6. 모델 훈련
set.seed(1) # 가중치 초기값을 어느 자리에서든 똑같이 하기 위해 설정
model <- nnet(Type ~., data = train_data, size = 2)
# size = 2는 은닉층 1개로 하고 은닉층의 뉴런의 갯수를 2개로 하겠다는 뜻
#7. 테스트 데이터 예측
result <- predict(model, test_data[,-1], type = "class")
result
#8. 모델 평가
sum(result == test_data[,1]) / length(test_data[,1])
#9. 모델 성능 개선
model2 <- nnet(Type ~., data = train_data, size = 5) # 은닉층의 뉴런 수 5개
result2 <- predict(model2, test_data[,-1], type = "class")
sum(result2 == test_data[,1]) / length(test_data[,1])
문제357. iris 품종을 분류하는 인공신경망을 R로 구현하시오.
#1.데이터 로드
iris <- read.csv("c:\\data\\iris2.csv", stringsAsFactors = T)
head(iris) # 마지막 컬럼(Species)이 label
#2. 결측치
colSums(is.na(iris))
#3. 정규화
normalize <- function(x){ return( x - min(x) / (max(x) - min(x) ))}
iris_norm <- as.data.frame(lapply(iris[,-5], normalize))
iris_scaled <- cbind(Species = iris$Species, iris_norm) # label을 1번인덱스에 붙임
head(iris_scaled)
#4. 데이터 분리
library(caret)
set.seed(1)
k <- createDataPartition(iris_scaled$Species, p = 0.9, list = F)
train_data <- iris_scaled[k,]
test_data <- iris_scaled[-k,]
nrow(train_data) #135
nrow(test_data) #15
#5. 모델설정
library(nnet)
#6. 모델훈련
set.seed(1)
model_iris <-nnet(Species ~., data = train_data, size = 2)
#7. 테스트 데이터 예측
result_iris <- predict(model_iris, test_data[,-1], type = "class")
#8. 모델 평가
sum(result_iris == test_data[,1]) / length(test_data[,1]) #0.8
#9. 성능개선
set.seed(1)
model_iris2 <-nnet(Species ~., data = train_data, size = 5)
result_iris2 <- predict(model_iris2, test_data[,-1], type = "class")
sum(result_iris2 == test_data[,1]) / length(test_data[,1]) #1
69 파이썬으로 신경망 모델 만들기(분류)
수치예측 : from sklearn.neural_network import MLPRegressor
분류 : from sklearn.neural_network import MLPClassifier
"와인의 품질을 분류하는 인공신경망 만들기"
#1. 데이터 로드
import pandas as pd
wine = pd.read_csv("c:\\data\\wine.csv")
wine.head()
#2. 결측치 확인
wine.isnull().sum()
#3. 정규화 진행
x = wine.iloc[:, 1:]
y = wine['Type']
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
x_scaled = scaler.fit_transform(x)
#4. 데이터 분리
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x_scaled, y, test_size = 0.1, random_state = 0)
print(x_train.shape, x_test.shape, y_train.shape, y_test.shape) #(160, 13) (18, 13) (160,) (18,)
#5. 모델 생성
from sklearn.neural_network import MLPClassifier
model = MLPClassifier(random_state = 0)
#6. 모델 훈련
model.fit(x_train, y_train)
#7. 예측
result = model.predict(x_test)
#8. 평가
sum(result == y_test) / len(y_test) * 100 # 100%
#9. 성능개선
from sklearn.model_selection import GridSearchCV
param_grid = {'hidden_layer_sizes' : [(100,50), (200,50),(100,100),(200,200)],
'activation' : ['relu','identity','tanh', 'logistic'],
'solver':['lbfgs','sgd','adam'] }
model2 = GridSearchCV( MLPClassifier(random_state = 0), param_grid, n_jobs = -1, verbose = 2)
model2.fit(x_train, y_train)
#최적의 하이퍼 파라미터의 조합을 확인하는 코드
print(model2.best_params_)
result2 = model2.predict(x_test)
sum(result2 == y_test) / len(y_test) * 100 #94.44444444444444
> 기존층은 은닉1층에 뉴런수 100개였는데(default) 성능개선에서 은닉2층으로하고 grid search를 돌려보니 오히려 정확도가 떨어짐. 2층까지 할 필요 없는 데이터였기 때문 > 층이 많고 뉴런의 갯수가 많다고 마냥 좋은 결과가 나오는 것은 아님.
문제358. (오늘의 마지막 문제) iris 데이터로 분류하는 파이선 신경망을 생성하세요.
#1. 데이터 로드
import pandas as pd
iris = pd.read_csv("c:\\data\\iris2.csv")
iris.head()
#2. 결측치 확인
iris.isnull().sum()
#3. 정규화 진행
x = iris.iloc[:, :-1]
y = iris.iloc[:,-1]
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
x_scaled = scaler.fit_transform(x)
#4. 데이터 분리
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x_scaled, y, test_size = 0.1, random_state = 0)
print(x_train.shape, x_test.shape, y_train.shape, y_test.shape) #(135, 4) (15, 4) (135,) (15,)
#5. 모델 생성
from sklearn.neural_network import MLPClassifier
model = MLPClassifier(random_state = 0)
#6. 모델 훈련
model.fit(x_train, y_train)
#7. 예측
result = model.predict(x_test)
#8. 평가
sum(result == y_test) / len(y_test) * 100
#9. 성능개선
from sklearn.model_selection import GridSearchCV
param_grid = {'hidden_layer_sizes' : [100, 50, 10, 150, 200], #은닉1층만 설정함
'activation' : ['relu','identity','tanh', 'logistic'],
'solver':['lbfgs','sgd','adam'] }
model2 = GridSearchCV( MLPClassifier(random_state = 0), param_grid, n_jobs = -1, verbose = 2)
model2.fit(x_train, y_train)
#최적의 하이퍼 파라미터의 조합을 확인하는 코드
print('최적의 하이퍼 파라미터 :', model2.best_params_)
result2 = model2.predict(x_test)
sum(result2 == y_test) / len(y_test) * 100
반응형