농업 환경 변화에 따른 작물 병해 진단 AI 경진대회

알고리즘 | CV | 분류 | 농작물 | Macro f1 score

  • moneyIcon Prize : 총 1,000만원
  • 1,912명 마감

 

재색, Private 2위, Private 점수: 0.95394, Ensemble

2022.02.04 23:56 5,803 Views language

대회에 참여하신 모든 분들 고생많으셨습니다.

구체적으로 어떻게 업로드 하라는 지침이 없어 다른 대회를 견본으로 삼아 게시글을 작성합니다.
깃허브에 모든 코드와 실행 방법, 모델 구조, 접근한 이유 등을 모두 작성하였습니다.
전반적인 예측은 BiT 와 Catboost의 앙상블로 이루어집니다.
궁금한 점이 있다면 여기에 댓글로 달아주시면 답변드리겠습니다.
최대한 오늘 안에 업로드 하기 위해 준비했지만, 그렇기에 미진한 점이 있을 것 같습니다.
최종 제출일인 2월 8일까지는 깃허브 내용이 언제나 수정 가능함을 미리 알려드립니다.
그리고 아래는 github의 첫페이지 Readme와 동일한 내용임을 말씀드립니다.

https://github.com/With-Coding-Cat/LG_plant_disease_diagnosis_competition

그리고 주최해 주신 LG AI Research와 주관하신 데이콘 관계자 분께 감사드립니다.

Code
로그인이 필요합니다
0 / 1000
곧미남
2022.02.05 00:41

고생하셨습니다. 멋진 아이디어와 구현된 내용을 보니 놀라웠습니다. 축하드립니다.

Ldoun
2022.02.05 17:27

글을 통해 많은 것 배웠습니다! 감사합니다.

비정상곰
2022.02.06 09:21

감사합니다:)! 많이 배워갑니다!

MIAA
2022.02.06 18:51

아이디어가 정말 멋있습니다! 조건에 따라 모델을 구현을 이런 방법으로도 할 수 있군요. 좋은 코드 공유 감사합니다 ^^

희주
2022.02.07 16:09

코드공유 감사합니다! 많이배웠습니다 축하드립니다!

뭉밍뭉밍
2022.02.07 20:43

좋은 아이디어 감사합니다 ! 

홍진성
2022.02.08 18:57

많이 배우고 갑니다.

곧미남
2022.03.05 15:56

1. 50분위수 데이터를 만드신 이유가 2, 4, 6, 8...%가 뜻하는건 시간으로서 48시간 중 2, 4, 6, 8 ...퍼센트 시간동안 영향을 받은 수치들을 대표하기 위해 생성한 것으로 보면될까요?

2. 주어진 모든 데이터를 사용하기 위해 누적일사와 CO2의 경우 존재 여부를 추가 한 후 전부 -1로 처리(boosting 알고리즘을 사용할 예정이기에 가능한 방식) 이와 같은 방법에서 -1로 처리 했을때 가능하다는게 정확히 왜 가능한지 좀 답변해주실 수 있나요? boosting 알고리즘의 어떤 내용 때문에 저 칼럼에서 없다면 -1로 해도 되는지 궁금하네요.

재색
2022.03.05 21:45

1. 좀더 자세히 설명드리겠습니다. 데이터를 보시면, 최초 데이터 시작 시간이 고정되어 있지 않습니다. 예를 들어, 어느 날은 오후 2시부터 시작되고, 어느날은 오전 1시부터 시작되기도 합니다. 또한 동일 시간의 데이터 중복 또한 확인됩니다. 그런데 percentile을 적용하면 48시간 동안의 최저점부터 최고점까지 순차적으로 나열됩니다. 특히, 해석적인 관점에서, 예를 들어 온도를 기준으로 든다면, 기존의 데이터는 특정 시간에 특정 온도를 뜻할 뿐이지만, percentile을 적용하게 되면, 10percentile에 나타나는 온도의 의미는 해당 작물이 그 온도보다 낮은 온도에 총 시간의 10%만큼 노출되었다는 의미와 동시에 그 온도보다 높은 온도에 총 시간의 90%만큼 노출되었음을 나타냅니다. 따라서 이번 대회의 경우 percentile을 적용하면 특정 기간동안 기록된 온도와 같은 시간적인 변동성을 지닌 데이터에서, 특정 온도에 해당하는 해석적 의미를 더해주는 것과 동시에, percentile을 적용함으로써 기존 데이터의 중복 문제, 혹은 일부 데이터 누락 문제에도 강건해질 수 있는 특징이 있기에 이런 방식으로 전처리 진행했습니다.

내용이 많아 추가로 하단에 작성드립니다.

재색
2022.03.05 22:03

2. 딥러닝은 scaling에 영향을 크게 받는 경향이 있습니다. 그래서 임의의 숫자를 대체하여 넣을 때는 고려할 사항이 많고, 임의의 숫자를 넣음으로써 결과가 나빠질 가능성도 커지게 됩니다. 심지어 존재 여부라는 새로운 칼럼을 집어 넣음으로써 input data의 양이 많아진다고 볼 수 있으며, 이는 학습에 더 어려움을 야기할 가능성이 있습니다.
하지만 제가 내용에 부스팅 알고리즘이라고 적었습니다만, 더욱 정확하게는 트리 구조의 알고리즘 하에서는 데이터의 scaling은 그다지 문제되지 않습니다. 트리 구조에서는 특정한 임계값으로 데이터를 분할하게 되며, 제가 기대한 바는 만약 누적일사와 CO2가 데이터 라벨 분류에 중요하게 작용할 시, 애초에 데이터가 존재하는지 여부를 나타내는 정보가 있다면 이에 초점을 둘 것이고, 그렇다면 우선적으로 존재여부에 따라 트리 구조하에서 하부 트리가 나뉘어지게 될 것이기 때문입니다. 제 예상처럼 누적일사와 CO2 데이터의 존재 여부를 모델이 우선적으로 고려하다면, 데이터가 존재하지 않았던 곳에 -1로 치환하여 넣더라도 아무 의미가 없게 될 것이고, 모델 학습을 위해 빈 값 없이 데이터를 채우는 용도로만 사용될 것입니다. 반면 동시에 누적일사와 CO2 데이터를 우선적으로 고려하지 않더라도 누적일사와 CO2 데이터가 존재할 경우는 모두 0 이상의 수치가 기록되어 있으며(누적 일사와 CO2는 음수로 떨어질 수 없습니다), -1은 이것이 존재하지 않았다는 것을 알려주는 역할을 하게 됩니다. 즉, 이 경우에서도 트리 구조하에서 -1인 경우는 따로 분리해낼 수 있게됩니다.

기본 베이스 라인으로 주어진 코드는 LSTM을 활용한 딥러닝 모델인데, 딥러닝과는 다른 ML 모델의 특성에 대한 이해를 기반해서 전처리를 쉽게 진행했다고 이해해주시면 될 것 같습니다.
혹시 더 궁금한 사항이 있으면 질문주시면 가능한 제가 이해하는 범위 내에서 답변드리겠습니다.

곧미남
2022.03.07 10:18

친절한 답변 감사드립니다. 1번 내용에 관해서 명확히 이해했습니다.

그렇다면, 2번 질문의 추가로 누적일사와 CO2가 데이터 라벨 존재 여부에 대한 하부 트리 구조는 분류 트리로서 누적일사 or CO2<=0, 누적일사 or CO2 > 0 이렇게 두 변수에 대한 분류 트리를 생성해서 분류 학습을 하도록 설계하셨다는거죠?

재색
2022.03.07 19:25

네 맞습니다. 좀더 정확하게는 누적일사 or CO2 < 0 인 경우와 나머지 경우를 모델이 분류해낼 거라 가정하고 전처리를 진행했습니다.

오재
2022.05.30 16:40

validation 과정에서 정답 mask를 가져와서 score를 계산하는 것으로 보이는데 원래는 예측한 값으로 mask를 뽑아 오는 것이 맞지 않나 궁금증이 생겨 질문드립니다.

재색
2022.06.13 09:55

요즘 제가 바빠서 답이 늦었습니다.

원래 예측한 값으로 mask를 뽑아오면, 실제 추론 과정과 동일하게 됩니다. 이때, 작물 종류, 질병 종류, 질병 심각도 모두를 맞추는지 여부를 확인하고자 하는 목적만 지닌다면, 그렇게 해도 무방합니다.

다만, 제가 한 방식은 3가지 각각에 대한 성능을 뽑아보기 위해 정답 mask를 가져왔습니다. 정답 마스크를 가져오게 되면, 현재 예측하는 대상(예: 질병 종류)이 정답인지 여부에 초점을 둘수 있게 됩니다.
동시에, 원래 예측했던 결과값들은 저장해 놓기 때문에, 3가지 예측치(작물 종류, 질병 종류, 질병 심각도) 중 하나만이라도 틀린다면 전체 통합 예측은 틀렸다고 산출 할 수 있습니다.

따라서 정답 mask를 가져오는 것은, 3가지 각각의 예측에 대한 정확성을 알기 위해서라고 생각해주시면 될 것 같습니다.