어제의 문제는 데이터의 최대 컬럼을 잘못 집어넣어서 발생했던 것으로 파악되었다.
문제를 해결하고 최종적으로 가지고 있는 데이터를 시각화 및 랜덤포레스트로 분석을 하였다.
안타깝게도 랜덤포레스트는 현재 분석하고자 하는 모델과 맞지 않았다.
그 이유는 전체 48만개 데이터에서 사고 데이터는 7000개 정도였기 때문이다.
따라서 대부분의 사고가 안 난 데이터를 기준으로 모델이 만들어졌기 때문에 정확도가 매우 높게 나와버렸다.
이것을 해결하기 위한 알고리즘 설정이 필요하다.
============================ Python ============================
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import matplotlib.font_manager as fm
# 플롯에 한글이 들어가도 출력할 수 있도록 설정하기
# path = 'C:/Windows/Fonts/malgun.ttf'
# font_name = fm.FontProperties(fname=path, size=50).get_name()
# plt.rc('font', family=font_name)
# ### 합친 두 데이터에 학습시킬 사고와 사고가 아닌 데이터를 명명하기
# # 데이터 불러오기
# df = pd.read_csv("G:/deep/project/final.csv", encoding='ANSI')
# # 명명할 데이터 객체 만들기
# test = []
# # 만약 특정 컬럼에 데이터가 존재한다면 사고가 발생했다는 뜻이므로 데이터가 있는지 없는지 확인
# for i in range(len(df.NumberofShips)):
# if df.NumberofShips.isnull()[i] == False:
# test.append("accident")
# else:
# test.append("non accident")
#
# # 나온 데이터를 acci 컬럼에 넣기
# df["acci"] = test
### 해상 데이터와 사고 데이터의 관계를 보여주는 그래프 출력해보기
# 출력할 데이터의 객체 만들기
# df = pd.read_csv("G:/deep/project/test.csv", encoding='utf-8')
# 필요한 컬럼만 가져오기
# df = df[['풍속(m/s)', '풍향(deg)', 'GUST풍속(m/s)', '현지기압(hPa)', '습도(%)', '기온(°C)', '수온(°C)',
# '최대파고(m)', '유의파고(m)', '평균파고(m)', '파주기(sec)', '파향(deg)', 'acci']]
# 결측치 없애기
# df = df.dropna()
# 결측치를 없애고 확인해보기
# check_data = df.acci.value_counts()
# print(check_data)
'''
non accident 480466
accident 6152
'''
# 데이터 분류하기
# df1 = df[['풍속(m/s)', '풍향(deg)', 'GUST풍속(m/s)', 'acci']] # 풍향, 풍속에 대해서 분류
# df2 = df[['현지기압(hPa)', '습도(%)', '기온(°C)', '수온(°C)', 'acci']] # 일반 기상 데이터로 분류
# df3 = df[['최대파고(m)', '유의파고(m)', '평균파고(m)', '파주기(sec)', '파향(deg)', 'acci']] # 해상 데이터로 분류
# print(df.head()) # 데이터 확인
# pairplot으로 컬럼간의 관계를 acci에 따라 분류해보기
# sns.pairplot(df1, hue='acci') # 풍향, 풍속에 대해서 분류
# sns.pairplot(df2, hue='acci') # 일반 기상 데이터로 분류
# sns.pairplot(df3, hue='acci') # 해상 데이터로 분류
# sns.pairplot(df, hue='acci') # 전체 데이터
# 그래프로 출력
# plt.show()
# 데이터를 png파일로 저장
# fig = plt.gcf()
# fig.savefig("전체 데이터.png")
# 테스트를 하기 위한 0,1로만 된 데이터를 만들어서 저장
# test = []
# for i in range(len(df.acci)):
# if df.acci[i] == "accident":
# test.append(1)
# else:
# test.append(0)
# 컬럼을 만든다.
# df["test"] = test
# 데이터를 저장한다
# df.to_csv("G:/deep/project/final.csv")
### 랜덤포레스트를 위한 테스트 셋팅
# 데이터 가져오기
df = pd.read_csv("G:/deep/project/final.csv", encoding='utf-8')
using_columns = ['풍속(m/s)', '풍향(deg)', 'GUST풍속(m/s)', '현지기압(hPa)', '습도(%)', '기온(°C)', '수온(°C)',
'최대파고(m)', '유의파고(m)', '평균파고(m)', '파주기(sec)', '파향(deg)', 'test']
# 사용할 데이터 컬럼만 추출
df = df[using_columns]
# 결측치 없애기. 안 했을 때랑 비교 필요. 안 하면 NaN값 에러가 난다. 꼭 해야함.
df = df.dropna()
from sklearn.model_selection import train_test_split
# 트레이닝, 테스트 세팅하기. 테스트 사이즈는 전체의 25%로 한다.
X_train, X_test, y_train, y_test = train_test_split(df[df.columns.values], df.test, test_size=0.25, stratify=df.test, random_state=123456)
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(n_estimators=100, oob_score=True, random_state=123456)
rf.fit(X_train, y_train)
print(rf)
'''
RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini',
max_depth=None, max_features='auto', max_leaf_nodes=None,
min_impurity_decrease=0.0, min_impurity_split=None,
min_samples_leaf=1, min_samples_split=2,
min_weight_fraction_leaf=0.0, n_estimators=100, n_jobs=1,
oob_score=True, random_state=123456, verbose=0,
warm_start=False)
'''
### 랜덤포레스트의 정확도 측정
from sklearn.metrics import accuracy_score
# 얼마만큼의 정확도를 가지고 있는지 확인
predicted = rf.predict(X_test)
accuracy = accuracy_score(y_test, predicted)
# 결과 출력
print(f'Out-of-bag score estimate: {rf.oob_score_:.3}')
print(f'Mean accuracy score: {accuracy:.3}')
### 결과를 시각화
# from sklearn.metrics import confusion_matrix
#
# cm = pd.DataFrame(confusion_matrix(y_test, predicted), columns=df.columns.values[using_columns], index=df.columns.values[using_columns])
# sns.heatmap(cm, annot=True)
# plt.show()
============================ Python ============================
'데이터 분석 > 데이터 분석 프로젝트' 카테고리의 다른 글
[기상청 콘테스트] 해면 기상 상태에 따른 선박 사고 위험도를 측정하는 모델을 개발 - 6(Weka를 이용한 분석) (0) | 2018.07.17 |
---|---|
[기상청 콘테스트] 해면 기상 상태에 따른 선박 사고 위험도를 측정하는 모델을 개발 - 5(전처리 및 TensorFlow 신경망 적용) (0) | 2018.07.16 |
[기상청 콘테스트] 해면 기상 상태에 따른 선박 사고 위험도를 측정하는 모델을 개발 - 3(에러) (0) | 2018.07.14 |
[기상청 콘테스트] 해면 기상 상태에 따른 선박 사고 위험도를 측정하는 모델을 개발 - 2(데이터 전처리) (0) | 2018.07.13 |
[기상청 콘테스트] 해면 기상 상태에 따른 선박 사고 위험도를 측정하는 모델을 개발 - 1(데이터 전처리) (0) | 2018.07.12 |