데이터 전처리편~위성 화상 데이터와 심층 학습에 의한 호수의 엽록소 농도 추정~

개요



위성 화상 데이터와 심층 학습에 의한 호수의 엽록소 농도 추정의 연구를 실시하고 있습니다.
위성 화상 데이터를 취득해, 위성 화상 데이터로부터 해당하는 수질 거점의 위도 경도를 지정해 추출한 픽셀치(DN값)나, 구름의 정보를 바탕으로 표를 작성했습니다. 앞으로 또 딥 뉴럴넷에 학습시키기 위해서, 데이터의 전처리·성형하고 싶습니다. 그 때 도움이 된 Python 프로그래밍 모듈이나 메소드 등에 대해 이번에는 기술하고 싶습니다.

원본 데이터 테이블



이런 느낌의 데이터를 작성하고 있습니다.

왼쪽에서 위성 화상 데이터 취득일, 수질 거점, 수질 거점의 위도 경도, 위성 화상 데이터의 밴드 타입, 추출한 픽셀치(DN값), cloud 구름 정보(0 or 1 구름이라면 1, 아니면 0 ), terrian (육지 여부),
cloudconfidence(구름일 가능성.
이제 딥 신경망에 입력하기위한 모양으로 변환합니다.

pandas로 조건 추출한 다음 표를 Array 형식으로 변환



딥 신경망에 입력하려면 데이터를 Array 유형으로 변환해야 합니다.
변환했을 때의 프로그래밍은 이쪽↓
import numpy as np
import pandas as pd
all_data = pd.read_excel("表のPath")

time = []
time = all_data["Time"].unique()
kyoten = []
kyoten = all_data["name"].unique()

list = []
list2 = []
pixel = []
CH = []
Cloud = []
terrian = []
CC = []
CS = []
for t in time:
    for n in kyoten:
        pixel = all_data["pixel"][(all_data["Time"] == t) & (all_data["name"] == n)].values
        CH = all_data["CH"][(all_data["Time"] == t) & (all_data["name"] == n)].values
        Cloud = all_data["cloud"][(all_data["Time"] == t) & (all_data["name"] == n)].values
        CC = all_data["cloudconfidence"][(all_data["Time"] == t) & (all_data["name"] == n)].values
        CS = all_data["cloudshade"][(all_data["Time"] == t) & (all_data["name"] == n)].values
        if len(CH2) != 0:
            list += [[pixel2, Cloud[0], CC[0], CS[0]]]
            list2 += [[CH[0]]]


data_array = np.array(list)
CH_array = np.array(list2)

여기서 사용한 모듈은 pandas와 numpy
기계 학습에는 필수 불가결한 두 가지군요.
여기서 포인트가 되는 것은 pandas 조건을 지정하여 테이블에서 값을 추출하는 방법 라고, 리스트로부터 np.array("list)로 array형으로 변환하고 있는 곳 정도군요.
그러나, 이런 느낌으로 3차원 이상의 불규칙한 array가 되고 있습니다.


다차원 목록을 1차원으로 평탄화하고 목록을 하위 목록으로 변환하는 방법



먼저 다차원 목록을 1차원으로 평탄화합니다.
참고로 한 사이트는 여기 → 다차원 목록을 1차원으로 평탄화하는 방법
for el in l:
        if isinstance(el, collections.Iterable) and not isinstance(el, (str, bytes)):
            yield from flatten(el)
        else:
            yield el


list1 = []
for x in data_array:
    list1 += flatten(x)

이것만으로는 모든 데이터가 평탄화되고 있으므로, 일자 마다의 픽셀치~클로로필치의 서브 세트로 나눕니다. 목록을 n개의 하위 목록으로 분할하는 방법
def split_list(l, n):
    """
    リストをサブリストに分割する
    :param l: リスト
    :param n: サブリストの要素数
    :return:
    """
    for idx in range(0, len(l), n):
        yield l[idx:idx + n]

#14個の要素でリストを分割
inputs = np.array(list(split_list(list1, 14)))

이것으로 완성입니다! 이제 데이터를 정규화하여 학습 데이터와 테스트 데이터로 나눕니다.

데이터 정규화 및 학습 데이터 테스트 데이터로 분할하는 방법



학습 데이터 및 테스트 데이터로 분할하는 방법
0~1로 정규화하기 전에 로그를 취하고 있습니다. 이는 데이터 분포를 보다 정규 분포에 가깝게 하여 기계 학습에 효과적으로 하기 때문입니다.

필요한 모듈 가져오기


from sklearn.model_selection import train_test_split
from sklearn import preprocessing

데이터의 로그를 취한 것을 0 ~ 1로 정규화


scaler = preprocessing.MinMaxScaler()
pixel_log = scaler.fit_transform(np.log(inputs[:, 0:11]))
cloud = scaler.fit_transform(inputs[:, 11:])
CH_log = scaler.fit_transform(np.log(CH_array))

픽셀 값과 구름 정보 등의 결합하고 위성 데이터와 엽록소 데이터의 결합 (일단 전부 셔플하기 위해



Numpy 배열을 결합하는 방법
input_log = np.concatenate((pixel_log, cloud), axis=1)

衛星データとクロロフィルデータの結合(いったん全部シャッフルするため)
zenbu = np.concatenate((input_log,CH_log),axis=1)


학습용 데이터와 테스트 데이터로 분할한 후 위성 데이터와 정답 엽록소 농도 데이터로 분할


zenbu_train, zenbu_test = train_test_split(zenbu, shuffle=True)
inputs_train = zenbu_train[:,0:14]
CH_train = zenbu_train[:,14:]
inputs_test = zenbu_test[:,0:14]
CH_test = zenbu_test[:,14:]



이상 길어졌습니다만, 데이터의 전처리는 이것으로 끝입니다!
다음 번은 드디어 딥 뉴럴 넷 구축입니다!
읽어 주셔서 감사합니다.

좋은 웹페이지 즐겨찾기