어제의 문제는 데이터의 최대 컬럼을 잘못 집어넣어서 발생했던 것으로 파악되었다.

문제를 해결하고 최종적으로 가지고 있는 데이터를 시각화 및 랜덤포레스트로 분석을 하였다.

안타깝게도 랜덤포레스트는 현재 분석하고자 하는 모델과 맞지 않았다. 

그 이유는 전체 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 ============================







+ Recent posts