Today I Learned

최지웅·2024년 5월 19일
0

Today I Learned

목록 보기
158/238

오늘 할일
1. LeetCode
2. 창엔 업무
3. 인공지능 개론 과제
4. 영상처리 Chap7공부
5. 책 챙기기
6. 핸드폰 포맷?
7. 창엔 동료평가 자동화 디버깅
8. 예비군 훈련필증 출력
9. 인공지능 FAQ과제

오늘 한일
1. 창엔 동료평가 자동화 디버깅

  • 오류샘플 추출: 권o형20->0, 김o경 19.4->19, 조o운 16->16, 홍o호 20->0
  • 동료평가 엑셀값 확인: 권o형(20, 20, 20, 20, 20, 20), 김o경(20, 15, 19, 20, 20, 20, 20), 조o운(20, 20, 20, 16, 12, 8), 홍o호(20, 20, 20, 20, 20, 20, 20)
  • 동료평가 엑셀기준 성적: 권o형(20), 김o경(19), 조o운(16), 홍o호(20)
  • 중간결론1: 엑셀의 값은 이상이 없다. 엑셀 자동화를 처리하는 코드에서 일부 오류가 발생하고 있다.
  • 자동화 점수값 확인: 조o운(20, 20, 20, 16, 8), 권o형(20, 20, 20, 20, 20, 20, 20), 김o경(20, 15, 19, 20, 20, 20, 20), 홍o호(null)
  • 문제확인: 엑셀데이터를 읽는 과정에서 일부 데이터가 누락되는 것을 확인
  • 오류 샘플의 동료평가 성적처리 과정 디버깅:
print("동료평가 성적 처리중...", end="")
for index, row in summary_excel.iterrows():
    student_id = row['학번']
    count = 0
    sum_grade = 0.0
    avg_grade = 0.0
    student2_list=[]
    for index2, row2 in peer_eval_excel.iterrows():
        if row2['피평가자 학번'] == student_id:
            count = count + 1
            if student_id in error_id:
                print(student_id, end=": ")
                print(int(row2['총점 / 만점'].split('/')[0]))
            sum_grade = sum_grade + int(row2['총점 / 만점'].split('/')[0])

이 과정에서 이미 일부 점수값이 누락되어 출력되었다.

  • 중간결론2: 데이터의 누락은 동료평가 처리 이전에 일어났다
  • 동료평가 전처리 검토: 동료평가의 전처리는 다른 팀의 조원을 잘못 평가했을 경우 해당 데이터를 누락시켜 자신의 팀의 평가만을 반영하기 위함이다. 동료평가 전처리를 수행하지 않았더니 정상적으로 데이터들이 출력되었고 올바른 값이 입력되는 것을 확인할 수 있었다.
print("5. 동료평가 성적 전처리중...", end="")
peer_eval_excel = pd.read_excel(path5, usecols=[2, 4, 11])

for index, row in peer_eval_excel.iterrows():
    student_id1 = row['피평가자 학번']
    student_id2 = row['평가자 학번']
    group1 = ''
    group2 = ''
    for index2, row2 in summary_excel.iterrows():
        if row2['학번'] == student_id1:
            group1 = row2[group_column_name]
        elif row2['학번'] == student_id2:
            group2 = row2[group_column_name]
    #if group1 != group2:
        #peer_eval_excel = peer_eval_excel.drop([index])
  • 해결책1: 전처리에서 같은조인지 확인하는 부분을 추가적으로 디버깅한다. 아마 '12조' '12 '조와 같이 실수로 오기입된 부분이 오류를 발생하는 것이 예측된다.
  • 해결책2: 이전의 사이버캠퍼스 동료평가 성적산출방법이 다른 조 학생의 평가를 배제했기에 전처리를 추가했었는데, 현재 방식이 변경된 것인지 반영하여 처리하는 것으로 보인다. 고로 전처리를 수행하지 않고 성적을 산출하여 오류를 해결한다.
  • 중간결론3: 전처리를 수행하지 않는다.
  • 검토: 전처리를 수행하지 않은 결과와 전처리를 수행한 결과를 실제 동료평가 성적과 비교해보았다. 성적의 정확도는 전처리를 수행하지 않은 결과가 더 정확했으나, 전처리를 수행하지 않은 경우에 0점처리된 학생의 점수가 기입된 경우가 있었다.
  • 중간결론4: 전처리를 수행해야하는 것은 맞으나, 그 과정에서 누락되는 값이 존재한다. 현재의 경우 점수가 0인 학생들을 추가적으로 비교하여 성적을 기입하고 있지만 전처리 과정에서 값이 누락되는 원인이 무었인지 더 알아봐야한다.
  • 문제확인: 전처리 과정에서 조가 다른 평가를 누락시키는 경우의 조가 실제 조와 일치하는지 비교해보았다.
print("5. 동료평가 성적 전처리중...", end="")
peer_eval_excel = pd.read_excel(path5, usecols=[2, 4, 11])

for index, row in peer_eval_excel.iterrows():
    student_id1 = row['피평가자 학번']
    student_id2 = row['평가자 학번']
    group1 = ''
    group2 = ''
    for index2, row2 in summary_excel.iterrows():
        if row2['학번'] == student_id1:
            group1 = row2[group_column_name]
        elif row2['학번'] == student_id2:
            group2 = row2[group_column_name]
    if group1 != group2:
        print(student_id1, group1, student_id2, group2)
        peer_eval_excel = peer_eval_excel.drop([index])

놀랍게도 피평가자의 조가 실제 조와 다르게 인식되는 경우가 있었다. 코드상에 group1이 잘못 들어간 것이다.

  • 문제파악: 코드에 문제가 없었다!! 사이버캠퍼스에 분류된 조와 엑셀종합파일에 분류된 조가 다른 케이스를 발견했다. 그 경우 다른 조의 평가로 인식되어 해당 값이 누락되어 0으로 표기됀 케이스가 있던 것이고, 실제 다른 조원을 평가한 것은 잘 거르고 있었던 것이다.

  • 결론: 사이버캠퍼스의 조가 맞고, 엑셀에 오기입된 조원이 존재했다. 조가 다른 경우를 print하여 목록으로 만들어 해당 인원들의 성적만 수작업으로 비교하는 것으로 결론을 내리겠다.
print("5. 동료평가 성적 전처리중...", end="")
peer_eval_excel = pd.read_excel(path5, usecols=[2, 4, 11])
review_list = []
for index, row in peer_eval_excel.iterrows():
    student_id1 = row['피평가자 학번']
    student_id2 = row['평가자 학번']
    group1 = ''
    group2 = ''
    for index2, row2 in summary_excel.iterrows():
        if row2['학번'] == student_id1:
            group1 = row2[group_column_name]
        elif row2['학번'] == student_id2:
            group2 = row2[group_column_name]
    if group1 != group2:
        review_list.append(student_id1)
        peer_eval_excel = peer_eval_excel.drop([index])
# 조 오기입 의심 학생 필터링
review_list = list(set(review_list))
print("종합파일 조 오기입이 의심되어 추가확인이 필요한 학생 수: ", len(review_list))
i = 1
for id in review_list:
    print(id, end=", ")
    if (i % 5 == 0):
        print()
    i = i + 1
  1. LeetCode
    1. Keys and Rooms의 초기코드는 list를 사용했는데, immutable한 collection이기에 컴파일 오류가 발생하는 문제가 있었다. 문제를 간단화하기 위해서 queue를 사용해보았다.
class Solution {
    public boolean canVisitAllRooms(List<List<Integer>> rooms) {
        List<Integer> queue=new ArrayList<>();
        int[] is_visited=new int[rooms.size()];
        for (int key: rooms.get(0))
            queue.add(key);

        while(!queue.isEmpty()){
            int room=queue.get(0);
            queue.remove(0);
            if(is_visited[room]==1)
                continue;

            for(int key: rooms.get(room))
                queue.add(key);
            is_visited[room]=1;
        }

        if(Arrays.stream(is_visited).sum()==rooms.size()-1)
            return true;
        else
            return false;
    }
}

최적화를 위해 다른 사람들의 코드를 참고하여, is_visited가 하나라도 미방문한 방(0)이 있다면 false를 리턴하기에

for(int i=0; i<size; i++)
            if(is_visited[i]==0)
                return false;
        return true;

로 리턴처리를 변경했다.

또 빠른 접근을 위해 queue를 단순 배열로 리팩토링하였다.

class Solution {
    public boolean canVisitAllRooms(List<List<Integer>> rooms) {
        int size=rooms.size();

        int[] queue=new int[1000*3];//키값들을 담을 리스트_중복값을 고려하여 3배 낭낭하게 할당
        int queue_tail=0, queue_head=0;
        
        int[] is_visited=new int[size];//방문 여부를 담을 배열

        for (int key: rooms.get(0))//첫번째 방에 있는 키들을 추가한다.
            queue[queue_tail++]=key;
        is_visited[0]=1;

        while(queue_tail!=queue_head){//열쇄 큐가 비어있지 않다면
            int room=queue[queue_head++];//pop한 뒤에
            if(is_visited[room]==1)//방문한 곳이면 pass
                continue;

            for(int key: rooms.get(room))//해당 방의 모든 키들을 추가한다.
                queue[queue_tail++]=key;
            is_visited[room]=1;//방문처리를 하고
        }

        for(int i=0; i<size; i++)
            if(is_visited[i]==0)
                return false;
        return true;
    }
}

profile
이제 3학년..

0개의 댓글