45일차

Suhyeon Lee·2024년 12월 3일

CodeKata

SQL

146. Employee Names

  • 작성한 쿼리
SELECT
  name
FROM
  Employee
ORDER BY
  name
;

147. Employee Salaries

  • 작성한 쿼리
SELECT
  name
FROM
  Employee
WHERE
  salary > 2000
  AND months < 10
ORDER BY
  employee_id
;

Python

58. 소수 만들기

  • 작성한 쿼리
def solution(nums):
    from itertools import combinations
    import math
    answer = 0
    for i in combinations(nums, 3):
        combi_sum = sum(i)
        isprime = True
        for j in range(2, int(math.sqrt(combi_sum))+1):
            if combi_sum%j==0:
                isprime = False
                break
        if isprime == True:
            answer += 1
    return answer

참고할 만한 다른 풀이

def solution(nums):
    answer = 0
    for i in range(0, len(nums)-2): #3개의수만 더해야함
        for j in range(i+1, len(nums)-1):#i의 다음 수부터 i를 뺀 개수
            for k in range(j+1, len(nums)):#j의 다음 수부터 i,j를 뺀 개수
                sum_num = nums[i] + nums[j] + nums[k] #3개의 수 합

                for x in range(2, round(sum_num/2)): #더한 수가 소수인지 확인하기
                    #정수 n을 2로 나누어 2부터 n/2 까지의 정수로 모두 나누어 확인
                    if sum_num % x == 0: #소수가 아니면 개수 안세기
                        break
                else:
                    answer += 1 #소수면 개수세기
    return answer
from itertools import combinations

def solution(nums):
    answer = 0
    for i in combinations(nums, 3):
        s = sum(i)
        chk = True
        for j in range(2, int(s ** 0.5) + 1):
            if s % j == 0:
                chk = False
                break
        if chk is True:
            answer += 1
    return answer
  • x가 만약에 합성수라고 하면 x = ab 죠? 근데 a, b 둘다 sqrt(x)보다 클 수는 없습니다. 따라서 a나 b 둘중에 하나는 무조건 sqrt(x)보다 작거나 같습니다. 그렇다면 x가 합성수가 되려면 sqrt(x)보다 작거나 같은 자연수로 한번이라도 나눠지면 됩니다. 이걸 뒤집어 말하면, x가 소수일려면 sqrt(x)보다 작거나 같은 자연수로 단 한번도 안나눠지면 되는거죠

소수 판별 알고리즘
순열과 조합

def solution(nums):
    from itertools import combinations as cb
    answer = 0
    for a in cb(nums, 3):
        cand = sum(a)
        for j in range(2, cand):
            if cand%j==0:
                break
        else:
            answer += 1
    return answer
  • else 문을 왜 if 보다 한 indentation 앞에 쓰신 건지 여쭈어보아도 될까요?? else를 막상 if 문 쪽이랑 같이 쓰면 코드 에러가 나네요.. 도와주시면 감사하겠습니다
    • else문을 for문과 같은 줄에 쓰게되면, for문의 반복이 끝나고나서 else문이 실행되게 됩니다(break로 빠져나가지 않는다면)
    • 구글에 파이썬 for else 라고 검색해봐요
  • cb에서 max_num만 뺴주어 소수판별하고 조합에서 나온 수의 합들만 체크해주면 시간도 많이 줄일 수 있습니다
def solution(nums):
    import itertools
    n_list = list(sum(i) for i in itertools.combinations(nums, 3))
    n_doc = {}
    for i in n_list:
        if i not in n_doc.keys():
            n_doc[i] = 1
        else:
            n_doc[i] += 1
    n_set = set(n_doc.keys())
    n_max = max(n_set)
    for i in range(2, int(n_max**0.5 + 1)):
        n_set -= set(range(2*i, n_max+1, i))
    answer = 0
    for i in n_set:
        answer += n_doc[i]
    return answer

팀 프로젝트

회귀분석 평가지표 종류

QnA

Q1. train 데이터에만 존재하는 칼럼으로 test 데이터 예측에 사용할 수 없는가?

A. train에만 존재하는 컬럼으로 test 데이터의 예측이 불가합니다.

  • 제가 baseline 모델을 작성한 환경(랜덤 포레스트 회귀 모델 + 원핫 인코딩)에서는
    train 데이터를 이용하여 학습(fit) 후 test 데이터를 이용하여 예측(predict) 시도 시, 에러가 발생합니다.
  • (사용이 가능하더라도) train에만 있는 컬럼으로 학습한 내용이 test 데이터에는 해당 컬럼들이 존재하지 않기 때문에,
    test 데이터에 대한 평가 지표가 굉장히 안 좋게 나올 것으로 예상됩니다.

A. 일부 컬럼은 직접 학습에 사용하면 안된다고 생각합니다.

  • 예를 들어 target인 'ECLO' 컬럼이 train 데이터의 '사망자 수, 중상자 수, 경상 자수, 부상자 수'를 이용하여 지표를 생성한 것이기 때문에,
    해당 컬럼 4가지 만으로도 완벽하게 target 데이터를 예측할 수 있게 됩니다. (오픈북)

Q2. train 데이터에만 존재하는 컬럼들은 쓸모가 없는가?

A. 주어진 컬럼들을 이용하여 자신만의 인사이트를 도출하고, 학습에 사용할 컬럼의 전처리를 어떻게 진행할지 등에 활용 가능하리라 생각합니다.

  • 어느 행정구역에서 법규 위반이 자주 일어나는지?
  • 어떤 시간대에 사망자가 많은지, 경상자가 많은지?
  • 요일에 따른 교통사고 특징은 어떻게 다른지? 등

출제자의 의도와 규칙 안에서 본인만의 질문과 답변을 찾아가면서
해당 컬럼들을 어떻게 활용할지는 작성자의 자유라고 생각합니다.

단순히 'train에만 있는 컬럼'을 이용해서 '새로운 컬럼'을 생성 -> 학습 및 예측 이 가능한지 질문하시는 거라면,
학습은 가능하지만 예측은 불가능합니다.

  • 'train에만 있는 컬럼'을 이용해서 똑같이 test 데이터에서도 '새로운 컬럼'을 생성(전처리) 해야 하는데,
    test 데이터에 'train에만 있는 컬럼'이 없기 때문에 똑같이 전처리가 불가능합니다.
  • 예측은, train과 동일한 컬럼을 가지는 test 데이터로 예측을 진행해야 하는데,
    train과 test의 컬럼 구성이 다르기 때문에 예측이 안됩니다.

제공된 데이터가 아닌 다른 출처에서 train과 동일한 동일한 컬럼의 정보들을 얻으실 수 있다면,
test데이터에도 train에 적용한 똑같은 컬럼 생성 및 예측까지 가능하겠지만,
그럴 거면, 이미 아시는 것처럼 다른 대회와 같이 애초에 trian과 test가 동일한 컬럼을 가지는 데이터셋을 제공해 줬으리라 생각합니다.

참고할 만한 내용
AutoML 및 Feature Engineering

회귀분석 평가지표 종류
RMSLE
RMSE와 RMSLE 차이
다중회귀와 다항회귀
iloc, loc를 사용한 행/열 선택법
로그 정규화
로그변환과 np.log()가 아닌 np.log1p()를 하는 이유

회고

  • 코드카타 풀다가 발상의 전환을 발견
class ALWAYS_CORRECT(object):
    def __eq__(self,other):
        return True

def solution(a):
    answer = ALWAYS_CORRECT()
    return answer;

임의로 만든 Class를 리턴하고 채점방식이 if 리턴값==정답값 을 통해 이루어지는것을 이용하여 __eq__메소드를 재정의하여 어떤값과 비교해도 true가 나오도록 한 편법이라고 함

  • 출제자의 허를 찌르는 발상도 나쁘지 않은 것 같다!
profile
2 B R 0 2 B

0개의 댓글