인사말

크리스마스는 잘 보내고 오셨나요!

저는 하루종일 애니 보고, 밥 먹고, 숙취에 골골댄 하루였어요

갑자기 달달구리한 블루베리 롤 케이크가 먹고 싶네요 😝

 

메리 크리스마스였습니다 여러분~!

오늘도 파이팅입니다!

 

오늘의 일정
오전(09:00 ~ 13:00) 10:00~11:00 코드 카타 3문제
11:00~12:00 프로그래머스 4문제
12:00~13:00 머신러닝 과제_지도학습
오후(14:00 ~ 18:00) 14:00~18:00 머신러닝 과제_지도학습

요약

  1. 코드 카타 3문제
    1. 순서쌍의 개수
    2. 모음 제거
    3. 문자 반복 출력하기
  2. 프로그래머스 4문제
    1. 암호 해독
    2. 최댓값 만들기(2)
    3. 제곱수 판별하기
    4. 인덱스 바꾸기
  3. 머신러닝 과제_지도학습 https://bmk0703.tistory.com/77

오전(09:00 ~ 13:00)

1. 코드 카타 3문제

1.1. 순서쌍의 개수

def solution(n):
    answer = 0

    for i in range(1,n+1):
        if n % i ==0:
            answer +=1
            
    return answer

🤔 문제 풀이방법

  • for i in range(1,n+1):
    • 1부터 n+1 만큼의 범위를 i에 받을게요
  • if n % i ==0:
    • 만약 n을 i로 나누었을 때 나머지가 0이라면 n의 자연수가 될 거예요
  • answer +=1
    • 그 값을 answer에 +=1 씩 해주면 문제 해결!

 

1.2. 모음 제거

def solution(my_string):
    answer = ''
    collection = ("a", "e","i","o","u")
    
    for i in collection:
        my_string = my_string.replace(i,'')
            
    return my_string

🤔 문제 풀이방법

  • collection = ("a", "e","i","o","u")
    • 모음만 가지고 있는 튜플을 만들어줄게요
  • for i in collection:
    • 이제 튜플에 있는 값들을 하나하나 i에 담아줄 겁니다
  • my_string = my_string.replace(i,'')
    • i에 있는 모음이 my_string에 있는 거라면 .replace()을 써서 공백으로 바꿔줄게요
  • return my_string
    • 그렇게 해서 return을 해주면 문제 해결!

 

다른 팀원 풀이 

def solution(my_string):
    answer = my_string
    vowel = ("a", "e", "i", "o", "u")
    
    for i in vowel:
        answer = "".join(answer.split(i))
    return answer

🤔 문제 풀이방법

  • vowel 이라는 튜플 생성
  • 반복문으로 “”.join(spilt())로 문자 제거

어떻게 이런 발상을 하시죠,, 와,, join이랑 split으로 해결할 수 있다는 게 신기했어요

 

1.3. 문자 반복 출력하기

def solution(my_string, n):
    answer = ''
    
    for text in my_string:
        answer += text * n
        
    return answer

🤔 문제 풀이방법

  • for text in my_string:
    • my_string을 text에 순차적으로 순회하며 넣어줄게요
  • answer += text * n
    • text 문장을 n번만큼 출력을 할 거라서 text 곱하기 n을 해주면 문제 해결!

 

2. 프로그래머스 4문제

2.1. 암호 해독

def solution(cipher, code):
    answer = ''
    
    for i in range(len(cipher)):
        if (i+1)%code ==0:
            answer += cipher[i]
            
    return answer

🤔 문제 풀이방법

  • for i in range(len(cipher)):
    • 주어지는 cipher의 길이만큼을 범위로 해서 i에 넣어줄게요
  • if (i+1)%code ==0:
    • 문제가 code의 배수 번째 글자만이라고 했으니까 나누었을 때 0이 되는 값을 찾을게요
    • 이때 i+1을 해주는 이유는, 배수이기 때문에 code를 곱해줘야 하거든요 기본값이 0이기 때문에 +1을 해주었어요
  •  answer += cipher[i]
    • 그렇게 해서 cipher의 i 번째에 있는 단어를 answer에 추가해 주면, 문제 해결!

 

2.2. 최댓값 만들기(2)

def solution(numbers):
    numbers.sort()
    
    return max(numbers[0]*numbers[1], numbers[-1]*numbers[-2])

🤔 문제 풀이방법

  • numbers.sort()
    • numbers 자체를 sort 해서 정렬해 줄게요
  • return max(numbers[0]*numbers[1], numbers[-1]*numbers[-2])
    • numbers 안에는 음수값도 있기 때문에 큰 값 순으로 정렬을 하면 맨 뒤로 가게 돼요
    • 그래서 양수 두 개를 곱한 값과 음수 두 개를 곱한 값의 최댓값(max)을 찾으면 문제 해결!

 

 

와우,, 8점이나 올라가는 문제였네요?? (,,꒪ᐞ꒪,,)

 

2.3. 제곱수 판별하기

def solution(n):
    answer = 0
    
    if (n**0.5) % 1 ==0:
        answer = 1
    else:
        answer = 2
        
    return answer

🤔 문제 풀이방법

  • if (n**0.5) % 1 ==0:
            answer = 1
    • 제곱수인지 아닌지 판별하는 거예요
    • n의 0.5 제곱이 1로 나누었을 때 나머지가 0이라는 것은 n이 제곱수라는 뜻이에요
    • 그래서 answer을 1로 출력하도록 했어요
  • else:
            answer = 2
    • 그 외의 경우는 2가 출력되도록 설정하면 문제 해결!

 

2.4. 인덱스 바꾸기

def solution(my_string, num1, num2):
    my_string = list(my_string)
    my_string[num1],my_string[num2] = my_string[num2],my_string[num1]
    
    answer = "".join(my_string)
    return answer

🤔 문제 풀이방법

  • my_string = list(my_string)
    • my_string를 리스트화해서 하나하나 뜯어줄게요
  • my_string[num1],my_string[num2] = my_string[num2],my_string[num1]
    • num1과 num2를 각각 num2, num1로 바꾸어줄 거라서 조건을 걸어줍니다
  • answer = "".join(my_string)
    • 파이썬은 위에서부터 밑으로 순서대로 읽기 때문에
    • answer은 ""에 my_string을 join해준 값을 리턴하면 문제 해결!

오후(14:00 ~ 18:00)

3. 머신러닝 과제


마무리

갈수록 문제 푸는 속도가 빨라진 게 느껴져서 너무 뿌듯해요!

역시 사람은 하나를 시작할 때 씨앗부터 해서 꽃을 피우기까지의 과정을 거치는 거 같아요

저는 지금 줄기가 돋아나고 봉우리가 생길랑 말랑 중인 거 같아요 🤭

 

꽃이 한 계절을 대표해서 피잖아요

거의 계절이 얼른 찾아왔으면 좋겠어요 히히

 

감사합니다!

오늘도 수고 많으셨어요!

인사말

안녕하세요!

내일이면 크리스마스네요

그러고 곧 연말이 다가오겠죠? 😣

연말이 주는 화려함은 언제 느껴도 좋은 거 같아요

걸어가는 거리마다 트리와 화려한 불빛 덕분에 행복하답니다 🥰

 

오늘 하루도 파이팅이고, 감기 조심하세요!

 

오늘의 일정
오전(09:00 ~ 13:00) 09:00~10:00 코드카타 3문제, 팀 오전 회의
10:00~13:00 프로그래머스 4문제 풀이
오후(14:00 ~ 18:00) 14:00~17;00 머신러닝 과제 - 이상치 처리하기
17:00~18:00 베이직반 수업
저녁(19:00 ~ 21:00) 18:00~20:00 머신러닝 과제 - 이상치 처리하기

요약

  1. 코드 카타 3문제
    1. 삼각형의 완성 조건(1)
    2. 중앙값 구하기
    3. 짝수는 싫어요
  2. 프로그래머스 4문제
    1. 대문자와 소문자 https://bmk0703.tistory.com/79
    2. 가장 큰 수 찾기 https://bmk0703.tistory.com/80
    3. n의 배수 고르기 https://bmk0703.tistory.com/81
    4. 약수 구하기 https://bmk0703.tistory.com/82
  3. 머신러닝 과제 - 이상치 처리하기
  4. 베이직반 수업

오전(09:00 ~ 13:00)

1. 코드 카타 3문제

1.1. 삼각형의 완성 조건(1)

def solution(sides):
    answer = 0
    
    if max(sides) < sum(sides) - max(sides):
        return 1
    else:
        return 2

🤔 문제 풀이방법

  • “가장 긴 변의 길이는 다른 두 변의 길이의 합보다 작아야 합니다.”
    • 문제를 보면 아예 답이 나와있어요. 이걸로 if문 완성해볼까요?
  • if max(sides) < sum(sides) - max(sides):
            return 1
    • 가장 긴 변의 길이를 max로 찾아주었고, 남은 sides의 숫자 중 max값을 빼준 값의 합이 max보다 크면 삼각형이 돼요!
    • 삼각형이 될 경우 1을 return해주고
  • else:
            return 2
    • max의 값이 더 크다면 삼각형이 되지 않으니 2를 return 해주면, 문제 해결!

다른 팀원 풀이 

def solution(sides):
    sides.sort()
    if sides[0] + sides[1] > sides[2] :
        return 1
    else :
        return 2
def solution(sides):
    sides.sort()
    return 1 if sides[-1] < sides[0] + sides[1] else 2

🤔 문제 풀이방법

  • sort() 함수를 사용해서 sides 리스트를 오름차순으로 정렬
  • 최대 값(정렬 했으므로 맨 마지막 수가 최댓값이니까 -1)이 나머지 두 수의 합보다 작으면 1 반환, 아니면 2 반환

 

와,, 진짜 깔끔한 코드이지 않나요?

저도 다른 팀원분들 코드를 볼 때마다 "나도 저렇게 깔끔, 간략하게 짜고 싶다"는 생각이 들어요

짱 재밌습니다 😲

 

1.2. 중앙값 구하기

def solution(array):
    sort_array = sorted(array)
    center_num = len(array) // 2
    
    answer = sort_array[center_num]
    return answer

 

🤔 문제 풀이방법

  • sort_array = sorted(array)
    • 중앙값을 찾아야 하니까 미리 정렬해줄게요
  • center_num = len(array) // 2
    • 중앙값은 array의 길이를 2로 나눈 몫의 위치에 있을 거예요
  • answer = sort_array[center_num]
    • 아까 정렬해준 array에 center_num의 값 번째에 있는 애가 중앙값이죠!
  • return answer
    • return 해주면 문제 해결!

 

다른 팀원 풀이 

def solution(array):
    array.sort()
    return array[len(array)//2]

🤔 문제 풀이방법

  • array를 오름차순으로 정렬한 후 array 길이의 반(/2)인 인덱스를 반환

 

깔끔 그 자체인 코드였습니다 🤭

 

1.3. 짝수는 싫어요

def solution(n):
    numbers = []                                
    for num in range(1,n+1, 2):                  
        numbers.append(num)              
    return numbers

🤔 문제 풀이방법

  • numbers = []
    • 숫자들을 담아줄 리스트를 만들어둘게요
  • for num in range(1,n+1, 2):
    numbers.append(num)
    • range가 1부터 n+1까지의 숫자 범위를 2칸씩 증가해서 num에 담아줄게요
    • 이렇게 하며 홀수만 담기게 될 거예요
    • 그 num을 아까 만들어놓은 numbers=[] 리스트에 넣어주면 문제해결!

 

다른 팀원 풀이 

def solution(n):
    return list(range(1, n+1, 2))

🤔 문제 풀이방법

  • range를 사용하여 1부터 n까지 2의 간격으로 리스트 생성하여 반환

 

개쩌는 거 같아요

벽이 느껴진다고 해야 할까나용 ㅋㅋㅋㅋㅋㅋㅋㅋ

나도 다음엔 저렇게 만들어내야지!! 🔥

 

(10:00~13:00)

2. 프로그래머스 4문제

2.1. 대문자와 소문자

def solution(my_string):
    return my_string.swapcase()

https://bmk0703.tistory.com/79

🤔 문제 풀이방법

  • return my_string.swapcase()
    • .swapcase()이 함수가 대문자는 소문자로 / 소문자는 대문자로 짜주는 함수라고 해요
    • 그래서 바로 return에다가 my_string.swapcase()을 적어서 결괏값을 만들어냈어요!

 

2.2. 가장 큰 수 찾기

https://bmk0703.tistory.com/80

def solution(array):
    return max(array), array.index(max(array))

🤔 문제 풀이

  • return
    • 바로 return 해줄 겁니다
  • max(array),
    • array 속에 있는 가장 큰 수를 뽑아 낼 거예요
  • array.index(max(array))
    • max(array)가 array 속에 몇 번째에 있는지 index를 통해서 찾아내주면 문제 해결!

 

2.3. n의 배수 고르기

https://bmk0703.tistory.com/81

def solution(n, numlist):
    answer = []
    
    for i in numlist:
        if i % n ==0:
            answer.append(i)
            
    return answer

🤔 문제 풀이

  • answer = []
    • 정답들이 들어갈 리스트를 만들어줄게요
  • for i in numlist:
    • numlist에 있는 값들을 순차적으로 순회해서 i에 넣어줄게요
  • if i % n ==0:
    • 만약 i를 n으로 나누었을 때 나머지가 떨어진다면
  • answer.append(i)
    • 먼저 만들어놓은 리스트에 append(i)를 해주면 문제 해결!

 

2.4. 약수 구하기

def solution(n):
    answer = []
    
    for i in range(1,n+1,1):
        if n % i ==0:
            answer.append(i)
            
    return answer

https://bmk0703.tistory.com/82

🤔 문제 풀이방법

  • answer = []
    • 정답들을 담을 리스트를 만들어줄게요
  • for i in range(1,n+1,1):
    • 범위를 지정해줄게요
    • 곱하기를 해야 하니까 1부터 시작해서 n+1까지 한 칸씩 범위를 뽑아낼게요
  • if n % i ==0:
    • 만약 n을 i로 나누었을 때 나머지가 0이라면 약수겠죠?
  •  answer.append(i)
    • 그 값을 만들어주었던 리스트에 append(i)를 해줄게요
    • 그럼 문제 해결!

오후(14:00 ~ 18:00)

3. 머신러닝 과제 - 이상치 처리하기

(17:00 ~ 18:00)

4. 베이직반 수업

def solution(n):
    answer = []
    
    for i in range(1,n+1,1):
        if n % i ==0:
            answer.append(i)
            
    return answer

🤔 문제 풀이방법

  • answer = []
    • 정답들을 담을 리스트를 만들어줄게요
  • for i in range(1,n+1,1):
    • 범위를 지정해줄게요
    • 곱하기를 해야 하니까 1부터 시작해서 n+1까지 한 칸씩 범위를 뽑아낼게요
  • if n % i ==0:
    • 만약 n을 i로 나누었을 때 나머지가 0이라면 약수겠죠?
  •  answer.append(i)
    • 그 값을 만들어주었던 리스트에 append(i)를 해줄게요
    • 그럼 문제 해결!

def solution(n, numlist):
    answer = []
    
    for i in numlist:
        if i % n ==0:
            answer.append(i)
            
    return answer

 

🤔 문제 풀이

  • answer = []
    • 정답들이 들어갈 리스트를 만들어줄게요
  • for i in numlist:
    • numlist에 있는 값들을 순차적으로 순회해서 i에 넣어줄게요
  • if i % n ==0:
    • 만약 i를 n으로 나누었을 때 나머지가 떨어진다면
  • answer.append(i)
    • 먼저 만들어놓은 리스트에 append(i)를 해주면 문제 해결!

def solution(array):
    return max(array), array.index(max(array))


🤔 문제 풀이

  • return
    • 바로 return 해줄 겁니다
  • max(array),
    • array 속에 있는 가장 큰 수를 뽑아 낼 거예요
  • array.index(max(array))
    • max(array)가 array 속에 몇 번째에 있는지 index를 통해서 찾아내주면 문제 해결!

실패 흔적들 

#1트
def solution(array):
    arr_sort = sorted(array)
    return max(arr_sort), arr_sort.index(max(arr_sort))

🤔 문제 풀이

  • 여태까지 큰 값을 찾을 때에 sorted 함수를 써서 먼저 정렬을 해줬어요
  • 그러고 최댓값을 찾고, 그 최댓값의 index 번호를 찾으려고 했어요
  • 결괏값에 나오는 index 번호가 +1이 된 상태로 나오더라구요

 

#2트
def solution(array):
    arr_sort = sorted(array)
    return [max(arr_sort), arr_sort.index(max(arr_sort))-1]

🤔 문제 풀이

  • 저는 매우 단순하기 때문에 -1을 해주었어요
  • 근데 두 번째 경우의 수에서는 틀렸다고 뜨길래 문제를 천천히 다시 읽어보았어요

 

#3트
def solution(array):
    return max(array), array.index(max(array))

🤔 문제 풀이

  • 그냥 정렬을 안 했어요
  • 문제 자체를 딱히 정리할 필요가 없다는 생각이 들었어요
  • 그래서 array를 있는 그대로 사용해서 문제를 풀었어요

 

def solution(my_string):
    return my_string.swapcase()

 

함수 설명 주의점
문자열 대문자로 변경 .upper() 대문자 혹은 소문자가 바뀌는 것이지,
객제 문장 자체가 바뀌는 것은 아님
문자열 소문자로 변경 .lower()
문자열의 대문자는 소문자로,
소문자는 대문자로
변경
.swapcase()  
첫 글자를 대문자로 변환 .capitalize()  

 

.upper() 

text = "love you"
print(text.upper())

# LOVE YOU

 

.lower() 

text = "LOVE YOU"
print(text.lower())

# love you

 

.swapcase() 

 

text = "LOVE you"
print(text.swapcase())

# love YOU

 

인사말

안녕하세요!

벌써 21일 차네요 시간 정말 순식간에 지나가요 ㅠ

 

크리스마스가 있는 이번주네요! 다들 크리스마스 때 뭐 하시나요? 😋

저는 집에서 과제나 하려고 합니다!

다들 따듯한 연말 되시고, 금주도 파이팅입니다! 🔥

 

저는 오늘 머신러닝 지도학습 결측값에 대해서 공부하였어요!

파일을 어떻게 분석을 해야 정확도가 올라갈지, 어떤 걸 선택해서 결측값을 처리할지 고민을 많이 해보았어요

 

물론,, 제가 하는 방식이 맞는 접근방식인지 잘 모르겠지만!

파일을 보면서 스스로 생각을 해보는 것도 필요하다 생각해요

나중에 튜터님께 피드백받으려고요 🤭

 

머리를 많이 쓰고, 공부를 많이 해야 하는 직종인 거 같아서 설레요

꾸준히 묵묵하게 성장하는 제가 되고 싶습니다 파이팅🔥

 

오늘의 일정
오전(09:00 ~ 13:00) 07:00~08:00 머신러닝 전처리 방법 복습
09:00~10:00 코드 카타 3문제, 팀 오전 회의
10:00~10:15 챕터 발제
10:15~11:00 머신러닝 과제1. 지도학습
11:00~13:00 가상환경 재설정 및 파이썬 재설치
오후(14:00 ~ 18:00) 14:00~16:00 머신러닝 특강
16:00~17:00 머신러닝 과제1. 지도학습
17:00~18:00 베이직반 수업(머신러닝)
저녁(19:00 ~ 21:00) 18:00~19:00 머신러닝 과제1. 지도학습

요약

  1. 코드 카타 3문제
    1. 배열의 유사도
    2. 양꼬치
    3. 세균 증식 ⬅️ 본문은 여기까지만 기재되어 있습니다!
  2. 챕터 발제
  3. 머신러닝 과제1. 지도학습 https://bmk0703.tistory.com/77
    1. 결측치 처리
  4. 머신러닝 특강
  5. 베이직반 수업
    1. 수학을 공부해야 하는 이유
    2. 그래프 보는 방법
    3. 자격증 추천

오전(09:00 ~ 13:00)

1. 코드 카타 3문제

1.1. 배열의 유사도

def solution(s1, s2):
    answer = 0
    
    for i in s1:
        if i in s2:
            answer += 1
            
    return answer

🤔 문제 풀이방법

  • for i in s1:
    • s1을 if로 순차적으로 순회해줄게요
  • if i in s2: answer += 1
    • 만약 i가 s2에 있는 값이라면 answer에 +1을 해줄게요
    • return으로 answer을 해주면, 문제 해결!

 

 

점수가 1111점이 되었어요 🤭

신기해서 기록해 두었답니다 히히

 

팀원 풀이 

def solution(s1, s2):
    answer = 0
    
    answer = len(set(s1) & set(s2))
    
    return answer

🤔 문제 풀이방법

  • set 함수를 사용해서 교집합 찾기
  • len 함수를 이용해서 교집합의 길이를 구하면 끝!

set() 함수를 써서 접근한 거 보고 신기했어요

 

1.2. 양꼬치

def solution(n, k):
    price = n*12000 + k*2000
    
    if k > 0 and n >= 10:
        price = n*12000 + (k-n//10)*2000
        
    return price

🤔 문제 풀이방법

  • price = n12000 + k2000
    • 총가격은 n(인 분) **12000원 + k(음료 개수) **2000이에요
  • if k > 0 and n >= 10: price = n*12000 + (k-n//10)*2000
    • 만약 음료수가 1개 이상이고 인 분이 10인 분 이상이면,
    • 가격은 n*12000 + (k-n//10)*2000 해줄게요
      • 10인 분당 음료수 1개가 서비스로 가거든요
  • return price를 해주면 문제 해결!

 

팀원 풀이 

def solution(n, k):
    return (n *12000) + ((k-(n//10)) *2000)
def solution(n, k):
    return 12000*n + 2000*k - 2000*(n//10)

새삼 간단하고 간결한 풀이였어요,,

저는 기본값까지도 정의 내려야 한다 생각했는데, 코드로 표현만 잘하면 해결되는 거였네요!

 

1.3. 세균 증식

def solution(n, t):
    
    return n*(2**t)

🤔 문제 풀이방법

  • return n*(2**t)
    • t에 따라 2배씩 증가하는 n(세균)의 개수를 구해야 하기 때문에 제곱근으로 해결!

 

팀원 풀이 

def solution(n, t):
    answer = n
    for i in range(t) :
        answer *= 2
    return answer
def solution(n, t):
    for i in range(t):
        n *= 2
    return n

 

아무래도 t(시간) 만큼 2배로 반복되어 번식되니까 for문과 range()로 범위 설정해서 푸신 코드였어요

사람마다 코드가 달라질 수 있다는 게 너무 재밌어요 🤭


마무리

머신러닝 과제를 하기 시작하니까 하루가 뚝딱 가네요

데이터셋을 분석하는 방법에 대해서 생각을 많이 해보게 되었어요

 

코드만 보면서 공부했을 때는 막막하고 어려워 보였지만

막상 직접 다뤄보니까 마냥 어려운 존재는 아니라는 걸 깨달았어요

코드는 어렵지 않죠,, 데이터셋 분석이 더 어렵다는 걸 느꼈거든요 😿

 

아무튼 제 나름의 생각을 가지고 데이터를 분석해 보아서 재밌었습니다 🤭

오늘 하루도 수고 많으셨습니다

감사합니다 :)

Chapter2_Assignment_241231.zip
0.05MB

목차

  1. CSV 파일 불러오기
    1. 데이터 분석
      1. data_info
      2. data_head
      3. data_nulls
  2. 데이터셋 탐색 및 전처리
    1. 결측치 처리
      1. 행 제거 
        1. 데이터 손실 40개 발생
    2. 이상치 탐지 및 제거
      1. boxplot 그래프
        1. CRIM
        2. NOX
        3. AGE
      2. IQR
      3. CRIM 이상치 제거
  3. 특성 선택
  4. 여러 회귀 모델 비교
    1. 데이터 분할(훈련, 테스트 데이터)
    2. 모델 학습
      1. 선형 회귀
      2. 의사결정나무
      3. 랜덤 포레스트 등
  5. 모델 성능 평가
    1. Mean Absolute Error (MAE): 예측값과 실제값의 절대 오차의 평균.
    2. Mean Squared Error (MSE): 예측값과 실제값의 제곱 오차의 평균.
    3. R² Score: 모델이 데이터의 변동성을 얼마나 설명하는지 나타내는 지표.
  6. 결과 분석

주제, 목표, 학습 내용 

더보기

💡 주제

주택 가격 예측 모델 구축

 

🎯 목표

주어진 주택 데이터셋을 사용하여 주택 가격을 예측하는 회귀 모델을 구축한다.

 

📖 학습 내용

- 지도 학습의 기본 개념과 회귀 분석을 이해하고, 실제 데이터에 적용하는 능력

  • 데이터 전처리 및 탐색
    • 데이터의 품질을 높이는 방법과 특징 선택의 중요성
  • 여러 회귀 모델의 이해
    • 다양한 회귀 기법의 원리와 적용 방법
  • 모델 성능 평가
    • 성능 지표의 이해 및 비교 분석을 통해 최적의 모델 선택

과제 가이드 

더보기
  • 데이터셋 탐색 및 전처리:
    • 결측치 처리
    • 이상치 탐지 및 제거
    • 특징 선택
  • 여러 회귀 모델 비교:
    • 선형 회귀
    • 의사결정나무
    • 랜덤 포레스트 등
  • 모델 성능 평가:
    • 지표를 사용하여 모델 성능을 비교합니다.
      • Mean Absolute Error (MAE): 예측값과 실제값의 절대 오차의 평균.
      • Mean Squared Error (MSE): 예측값과 실제값의 제곱 오차의 평균.
      • R² Score: 모델이 데이터의 변동성을 얼마나 설명하는지 나타내는 지표.
  • 결과 분석:
    • 각 모델의 성능을 비교하고 최적의 모델을 선택하여 결과를 시각화합니다.
      • 시각화: 성능 지표를 막대 그래프로 시각화하여 쉽게 비교할 수 있도록 합니다. matplotlib 또는 seaborn을 사용하여 막대 그래프를 그립니다.
    •  

0. 자료 분석 

housingdata.csv
0.03MB

 

  1. 주제 : 보스턴 주택 가격 데이터
  2. 칼럼 수 : 총 14개
    1. CRIM : 범죄율
    2. ZN : 25,000 평방피트 이상으로 구획된 주거 지역의 비율
    3. INDUS : 비소매 상업 지역 면적의 비율
    4. CHAS : 찰스강 인접 여부
    5. NOX : 일산화질소 농도
    6. RM : 주택의 평균 방 개수
    7. AGE : 1940년 이전에 건축된 소유 주택의 비율
    8. DIS : 보스턴의 5개 고용센터까지의 가중 거리
    9. RAD : 방사형 고속도로 접근성 지수
    10. TAX : 10,000달러당 재산세율
    11. PTRATIO : 학생-교사 비율
    12. B : 흑인 인구 비율
    13. LSTAT : 하위 계층의 비율(%)
    14. MEDV : 주택의 중앙값 (단위:$1000)
  3. 행 개수 : 총 506개
  4. NaN 수
    • CRIM, ZN, INDUS, CHAS, AGE, LSTAT열에 각각 20개씩, 120개

저는 주택 가격에 있어서 범죄율(CRIM), 일산화질소 농도(NOX), 주택 나이(AGE)가 영향력이 높다고 생각했어요.

이유는

  1. 범죄율(평균값) : 범죄율이 높으면 치안이 좋지 않기 때문에 주택 가격에 변동이 심할 거라 생각했어요.
  2. 일산화질소 농도(결측치 없음) : 주택 근처에 유해물질의 농도가 짙다면 쾌적한 생활 환경이 되지 못한다고 생각했어요.
  3. 주택 나이(최빈값) : 노후된 주택이라면 수리비가 추가적으로 더 들 테니, 주택 가격에 영향이 있다고 생각했어요.

영향력이 있다고 생각되는 CRIM, NOX, AGE에 대해서 데이터를 어떻게 처리하고, 모델을 학습시킬지를 해볼게요

 

제 가설이 맞는지 아닌지를 검증하는 단계예요!

검증하러 가봅시다 😎


1. CSV 파일 불러오기

# 원본 CSV 파일 불러오기
import pandas as pd
df_housingdata = pd.read_csv('housingdata.csv')
df_housingdata

 

CRIM, NOX, AGE만 있는 데이터셋 불러오기

# Filtered_housingdata2 불러오기_CRIM, NOX, AGE,MEDV만 있는 파일)
import pandas as pd
df_filtered_housingdata2 = pd.read_csv("filtered_housingdata2.csv")
df_filtered_housingdata2

 

❤️‍🩹 데이터셋을 따로 만들어보려고 했는데 계속 KeyError가 나더라구요 그래서 gpt한테 파일 만들어달라고 요청해서 불러왔어요

1.1. 데이터 분석

  • filtered_housingdata의 구조를 알아볼 거예요
  • info, head, null을 써서 간략하게 알아볼게요

1.1.1. data_info

  • 데이터의 타입을 알아보는 겁니다.
  • 칼럼명과 수, Non-Null 수, date-type을 알아볼 수 있어요

# 데이터 구조 확인_데이터 타입 확인_(칼럼 수, non-null 수, 데이터 타입)
data_info = df_filtered_housingdata2.info()

 

📚 자료 분석

  • RangeIndex: 506 entries, 0 to 505
    • 506개의 행이 있고, 0부터 505까지 있어요
  • Data columns (total 3 columns)
    • 3개의 칼럼이 있다는 것을 알 수 있어요
  • dtypes: float64(3)
    • 데이터 타입은 float64가 3개가 있어요

 

1.1.2. data_head

# 자료의 상위 5개만 추출_head()
data_head = df_filtered_housingdata2.head()
data_head

 

📚 자료 분석

  • 데이터셋의 상위 5줄을 뽑아오는 코드입니다.

 

1.1.3. data_nulls

# nulls 개수 확인_isnull().sum()
data_nulls = df_filtered_housingdata2.isnull().sum()
data_nulls

 

📚 자료 분석

  • 각 칼럼(열)의 결측값 개수를 알려주는 isnull() 함수예요
  • 반대로, 결측값이 아닌 데이터를 확인하려면 notnull() 함수를 써주시면 돼요
  • 해당 데이터셋에는 CRIM, AGE에 각각 20개의 결측값이 있는 걸 확인할 수 있어요

2. 데이터셋 탐색 및 전처리

2.1. 결측치 처리

2.1.1. 행 제거

# 결측치 처리_행 제거(데이터 손실 발생 40개)
# NaN이 입력된 값에 다른 값을 대체하는 순간 신뢰성이 떨어진다고 판단해서 "제거"로 결측치를 처리함
df_filtered_housingdata_dropped_rows = df_filtered_housingdata2.dropna()
df_filtered_housingdata_dropped_rows

 

📚 자료 분석

  • 결측치가 있는 행을 제거했어요.
  • 처음에는 총 506개의 행을 가지고 있었으나, 결측값이 있는 행을 제거하니까 40개가 손실되었어요
  • 원래부터 NaN였던 값에 다른 값으로 대체를 한다는 것부터가 신뢰성이 많이 떨어진다고 생각해요
  • 그래서 제거로 결측값을 처리할 겁니다.

2.2. 이상치 탐지 및 제거

🤔 이상치 탐지를 처리하기 , 저의 생각

  • 이상치 탐지를 하는 방법에는 "제거", "변환", "IQR 방법"이 있어요
  • 제일 깔끔하게 처리할 거면 제거하는 것이 알맞다고 생각했어요
    • 그래도 제거하기 전에 얼마나 분포되어 있는지 확인을 해봐야겠단 생각이 들었어요
  • 변환은 이상치를 다른 값으로 변환하는 것이기 때문에 신뢰성이 높다고 생각하지 않았어요
  • IQR 방법은 1사분위, 2사분위, 3사분위, 4사분위로 각각 0~25%, 25~50%, 50~75%, 75~100%의 범위를 가져요
    • 1사분위 수(값 기준 하위 25%되는 값)와 3사분위 수(값 기준 상위 25%되는 값)을 찾으면 돼요

 

2.2.1 boxplot 그래프

  • boxplot() 함수의 옵션
    • ylim : y축의 범위
    • names : 변수에 이름 붙이기
    • col : 색상

 

2.2.1.1. CRIM

# 그래프 만들기(CRIM 칼럼의 이상치, 최댓&최솟값, 유효값 확인)
# 해석 : 데이터 양이 적어서 판단이 불가하다고 판단함
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.boxplot(df_filtered_housingdata_dropped_rows['CRIM'])
plt.title("CRIM")   # 그래프 제목 적기

📚 자료 분석

  • 결측치를 제거한 파일에서 "CRIM"의 botplot 그래프를 만들어냈어요
  • 데이터 총량이 부족하여 이상치 확인이 어려워 보여요

 

2.2.1.2. NOX

# 그래프 만들기(NOX 칼럼의 이상치, 최댓&최솟값, 유효값 확인)
# 해석 : 이상치가 없다고 판단함
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.boxplot(df_filtered_housingdata_dropped_rows['NOX'])
plt.title("NOX")    # 그래프 제목 적기

📚 자료 분석

  • 이상치를 뜻하는 동그라미가 없는 걸 보니, 이상치가 확인되지 않는다고 판단했어요
  • 중간값은 약 0.53이고, 1사분위 값은 약 0.45, 3사분위 값은 약 0.61로 확인되었어요
  • 최솟값은 약 0.4이고, 최댓값은 약 0.9로 확인되었어요

 

2.2.1.3. AGE

# 그래프 만들기(AGE 칼럼의 이상치, 최댓&최솟값, 유효값 확인)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.boxplot(df_filtered_housingdata_dropped_rows['AGE'])
plt.title("AGE")    # 그래프 제목 적기

📚 자료 분석

  • AGE도 마찬가지로 이상치가 발견되진 않았어요
  • 중간값으로 약 80이고, 1사분위 값은 약 43이고, 3사분위 값은 약 97로 확인되었어요
  • 최솟값은 약 0.2이고, 최댓값은 약 100으로 확인되었어요

 

이제 확인이 되었으니 CRIM 칼럼을 어떻게 처리해야 할지 고민해보았어요

일단 제거를 해보았습니다.

 

2.2.2. IQR

# 특정 열의 이상치 확인(IQR 방법)
Q1 = df_filtered_housingdata_dropped_rows['CRIM'].quantile(0.25)
Q3 = df_filtered_housingdata_dropped_rows['CRIM'].quantile(0.75)
IQR = Q3 - Q1

# 이상치 범위 설정
lower_bound = Q1 - 1.5 *IQR
upper_bound = Q3 + 1.5 *IQR

outliers = df_filtered_housingdata_dropped_rows[
    (df_filtered_housingdata_dropped_rows['CRIM'] < lower_bound) | 
    (df_filtered_housingdata_dropped_rows['CRIM'] > upper_bound)]

outliers

📚 자료 분석

  • 총 62개의 행이 나온다는 걸 확인할 수 있었어요
  • 그 행들은 1사분위 값과 3사분위 범위를 벗어난 이상치들을 뜻한다고 생각했어요

 

2.2.3. CRIM 이상치 제거

# CRIM 이상치 제거
df_no_outliers = df_filtered_housingdata_dropped_rows[
    (df_filtered_housingdata_dropped_rows['CRIM'] >= lower_bound) & 
    (df_filtered_housingdata_dropped_rows['CRIM'] <= upper_bound)]

df_no_outliers

📚 자료 분석

  • 그래서 아까 구해놓은 범위에 있던 값들을 삭제해주었어요
  • 데이터 양이 404개까지 줄어들었어요

제거하는 방식으로 이상치를 처리해주었어요

이제 데이터를 학습 데이터와 테스트 데이터로 분할해준 뒤, 모델을 학습시켜볼게요

 

4. 여러 회귀 모델 비교

4.1. 데이터 분할(훈련, 테스트 데이터)

# 훈련 데이터와 테스트 데이터 분리
from sklearn.model_selection import train_test_split

# 입력 변수(X)와 타겟 변수(y) 분리
X = df_no_outliers.drop(columns=['MEDV'])  # 'target'은 목표 변수(예: CRIM과 무관한 타겟 변수)
y = df_no_outliers['MEDV']  # 타겟 변수 이름을 지정

# 훈련 데이터와 테스트 데이터로 분리 (80% 훈련, 20% 테스트)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 결과 확인
print("훈련 데이터 크기:", X_train.shape)
print("테스트 데이터 크기:", X_test.shape)

 

4.2. 모델 학습

4.2.1. 선형 회귀형 모델

# 선형 회귀형 모델 생성, 학습

from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score

# 선형 회귀 모델 생성 및 학습
model = LinearRegression()
model.fit(X_train, y_train)

# 예측
y_pred = model.predict(X_test)

 

4.2.2. 의사결정나무

# 의사결정나무 회귀 모델 생성 및 학습
from sklearn.tree import DecisionTreeRegressor

# 의사결정 회귀 나무 모델 생성 및 학습
tree_model = DecisionTreeRegressor()
tree_model.fit(X_train, y_train)

# 예측
y_pred = tree_model.predict(X_test)

# DecisionTreeRegressor의 하이퍼 파라미터
tree_model = DecisionTreeRegressor(
    max_depth=5,    # 개별 트리의 최대 길이를 5로 설정
    min_samples_split=10)   # 노드를 분할 시 필요한 최소 샘플 개수 10으로 지정

 

4.2.3. 랜덤 포레스트

# 랜덤 포레스트 모델 생성 및 학습
from sklearn.ensemble import RandomForestRegressor

# 랜덤 포레스트 회귀 모델 생성 및 학습
forest_model = RandomForestRegressor(
    n_estimators=100, random_state=42
    )
forest_model.fit(X_train, y_train)

# 예측
y_pred = forest_model.predict(X_test)

# RandomForestRegressor의 하이퍼 파라미터
forest_model = RandomForestRegressor(
    n_estimators=200,   # 생성할 나무 개수를 200으로 설정
    max_depth=10,   # 개별 트리의 최대 길이를 10으로 설정
    min_samples_split=5,    # 노드를 분할하기 위한 최소 샘플 수를 5개로 설정
    random_state=42 # 모델의 결과를 재현 가능하도록 랜덤 시드를 설정함(생략 가능)
)

## n_estimators : 랜덤 포레스트에서 생성할 나무의 개수 지정 (기본값 == 100)
## max_depth: 개별 트리의 최대 깊이.
## min_samples_split: 노드를 분할하기 위한 최소 샘플 수.
## random_state : 모델의 결과를 재현 가능하게 하기 위해 랜덤 시드를 설정함 (필요 시, 생략 가능)

 

5. 모델 성능 평가

선형 회귀형 모델 평가 

 

📚 선형 회귀형 모델 평가 결과 분석

  • 오차의 평균(높을수록 오차가 많이 일어난다는 것을 의미)
    • Mean Squared Error: 56.675544148847685
      • Mean Squared Error는 제곱근의 평균이에요 대충 56에 루트를 씌운 만큼의 차이가 발생한다는 거예요
      • 숫자가 적을수록 오차가 적다는 것을 의미해요
    • R^2 Score: 0.006371530245328549
      • R^2는 변동성을 뜻해요
      • 범위가 0~1 사이에 있는 값이에요
      • 1에 가까울수록 예측을 잘한다는 뜻이고, 0에 가까울수록 예측을 못한다는 뜻이에요 :)

 

의사결정나무 회귀 모델 평가 

# 의사결정나무 회귀 모델 평가
## 선형 회귀형과 비교하였을 때 mse가 더 높은 것을 보아 선형 회귀형 모델의 성능이 좋아보임

from sklearn.metrics import mean_squared_error, r2_score

# 성능 평가
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

print(f"Mean Squared Error: {mse}")
print(f"R2 Score: {r2}")

 

📚 의사결정나무 회귀 모델 평가 결과 분석

  • Mean Squared Error: 68.93506172839507
    • MSE가 선형 회귀형 보다 높게 나왔기 때문에 선형 회귀형 보단 성능이 낮아 보인다고 판단함
  • R2 Score: -0.20856078095584807
    • 1과 가까울수록 예측을 잘한다는 것을 의미하지만, 음수값이 도출됨

 

랜덤 포레스트 모델 평가

# 랜덤 포레스트 모델 평가
## 다른 모델들과 비교했을 시, mse 지수가 가장 낮게 나옴
## 따라서, 가장 성능이 좋은 모델은 랜덤 포레스트라고 판단함
from sklearn.metrics import mean_squared_error, r2_score

# 성능 평가
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

print(f"Mean Squared Error: {mse}")
print(f"R2 Score: {r2}")

 

📚 의사결정나무 회귀 모델 평가 결과 분석

  • Mean Squared Error: 44.79970725925926
    • MSE가 앞선 2개의 모델 중 가장 낮게 나옴
  • R2 Score: 0.2145772001312125
    • R^2 Score도 마찬가지로 가장 높게 나옴

요약

  • 결측치가 포함된 행을 삭제하면 데이터 양이 줄어들어 이상치를 찾기 어렵다.
  • CRIM, NOX, AGE의 적은 데이터 양만으로는 MEDV(주택 가격 예측)를 알기 힘듦
  • 모델을 학습 시킬 때 데이터 양이 많을수록 R^2 Score은 1에 가까워지고, MAE, MSE들의 값은 작아질 것으로 추정됨

 

결론

  • 데이터 전처리 작업부터 잘못하였기 때문에 모델 끼리 성능 평가를 하는 것은 의미없어 보임
  • 데이터 전처리 작업을 처음부터 다시 해볼 생각임

'과제' 카테고리의 다른 글

[머신러닝_비지도 학습] 고객 세분화 분석  (0) 2024.12.30

목차

  1. 결측값 처리
    1. 결측값 처리 방법
      1. 제거
      2. 대체
        1. 0으로 대체
        2. 각 열의 평균값으로 대체
        3. 각 열의 중간값으로 대체
        4. 각 열의 최빈값으로 대체
      3. 예측
  2. 이상값 처리
    1. 이상치란?
      1. 이상치 확인 방법
      2. 이상치 처리 방법
        1. 제거
        2. 대체
        3. 변환
  3. 중복값 제거
  4. 데이터 타입 변환
    1. 데이터 타입 변환의 필요성
      1. 정수형
      2. 문자열
      3. 부등 소수점
  5. 인코딩
    1. 인코딩이란? 
    2. 인코딩 방법
  6. 샘플링
    1. 샘플링이란? 
    2. 샘플링 방법
  7. 특징 선택 및 추출
    1. 특징 선택 및 추출이란?
    2. 특징 선택 방법
    3. 특징 추출 방법

1. 결측값 처리

1.1. 결측값 처리 방법

1.1.1. 제거

  • 정의 : 결측값이 포함된 행 또는 열을 제거
# 결측값이 포함된 행 제거
df_dropped_rows = df.dropna()

# 결측값이 포함된 열 제거
df_dropped_cols = df.dropna(axis=1)
행 제거 = df.dropna()
열 제거 = df.dropna(axis=1)

 

1.1.2. 대체

  • 정의 : 결측값을 특정 값으로 대체

1.1.2.1. 결측값을 0으로 대체

# 결측값을 0으로 대체
df_filled = df.fillna(0)
0으로 대체 = df.fillna(0)

 

1.1.2.2. 결측값을 각 열의 평균값으로 대체

# 결측값을 각 열의 평균값으로 대체
df_filled_mean = df.fillna(df.mean())
평균값 = df.fillna(df.mean())

 

1.1.2.3. 결측값을 각 열의 중간값으로 대체

# 결측값을 각 열의 중간값으로 대체
df_filled_median = df.fillna(df.median())
중간값 = df.fillna(df.median())

 

1.1.2.4. 결측값을 각 열의 최빈값으로 대체

# 결측값을 각 열의 최빈값으로 대체
df_filled_mode = df.fillna(df.mode().iloc[0])
최빈값 = df.fillna(df.mode().iloc[0])

 

1.1.3. 예측

  • 정의 : 머신러닝 모델을 사용하여 결측값을 예측
from sklearn.linear_model import LinearRegression

# 결측값이 있는 열과 없는 열 분리
df_with_na = df[df['column_with_na'].isnull()]
df_without_na = df[df['column_with_na'].notnull()]

# 회귀 모델 학습
model = LinearRegression()
model.fit(df_without_na[['feature1', 'feature2']], df_without_na['column_with_na'])

# 결측값 예측
predicted_values = model.predict(df_with_na[['feature1', 'feature2']])

# 예측된 값으로 결측값 대체
df.loc[df['column_with_na'].isnull(), 'column_with_na'] = predicted_values
결측 값이 있는 열과 없는 열 분리 df_with_na = df[df['column_with_na'].isnull()]
df_without_na = df[df['column_with_na'].notnull()]
회귀 모델 학습 model = LinearRegression()
model.fit(df_without_na[['feature1', 'feature2']], df_without_na['column_with_na'])
결측값 예측 predicted_values = model.predict(df_with_na[['feature1', 'feature2']])
예측된 값으로 결측값 대체 df.loc[df['column_with_na'].isnull(), 'column_with_na'] = predicted_values

2. 이상값 처리

2.1. 이상치란?

  • 정의
    • 데이터셋에서 비정상적으로 큰 값이나 작은 값
    • 이상치는 분석 결과에 큰 영향을 미칠 수 있으므로, 이를 적절히 처리하는 것이 중요

2.1.1. 이상치 확인 방법

자료를 분석 후 비율을 조정해야 해요

# 특정 열의 이상치 확인 (IQR 방법)
Q1 = df['column_name'].quantile(0.25)
Q3 = df['column_name'].quantile(0.75)
IQR = Q3 - Q1

# 이상치 범위 설정
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR

# 이상치 확인
outliers = df[(df['column_name'] < lower_bound) | (df['column_name'] > upper_bound)]
print(outliers)
이상치 확인(IQR 방법) Q1 = df['column_name'].quantile(0.25) 
Q3 = df['column_name'].quantile(0.75) 
IQR = Q3 - Q1
이상치 범위 설정 lower_bound = Q1 - 1.5 * IQR 
upper_bound = Q3 + 1.5 * IQR
이상치 확인 outliers = df[(df['column_name'] < lower_bound) | (df['column_name'] > upper_bound)] 
print(outliers)

 

2.1.2. 이상치 처리 방법

2.1.2.1. 제거

  • 정의 : 이상치를 데이터셋에서 제거
# 이상치 제거
df_no_outliers = df[(df['column_name'] >= lower_bound) & (df['column_name'] <= upper_bound)]

 

2.1.2.2. 대체

  • 정의 : 이상치를 특정 값으로 대체
# 이상치를 평균값으로 대체
mean_value = df['column_name'].mean()
df['column_name'] = df['column_name'].apply(
lambda x: mean_value if x < lower_bound or x > upper_bound else x)

 

2.1.2.3. 변환

  • 정의 : 이상치를 변환하여 데이터의 분포를 조정

3. 중복값 제거

# 중복된 행 확인
print(df.duplicated().sum())

# 중복된 행 제거
df_no_duplicates = df.drop_duplicates()
중복된 행 확인 print(df.duplicated().sum())
중복된 행 제거 = df.drop_duplicates()

4. 데이터 타입 변환

  • Pandas의 .astype() 메서드를 사용

4.1. 데이터 타입 변환의 필요성

  • 잘못된 데이터 타입은 분석 결과에 영향을 미칠 수 있음
  • 잘못된 데이터 타입은 모델 학습에 오류를 발생시킬 수 있음

 

4.1.1. 정수형

# 특정 열의 데이터 타입을 정수형으로 변환
df['column_name'] = df['column_name'].astype(int)
정수형 = df['column_name'].astype(int)

 

4.1.2. 문자열

# 특정 열의 데이터 타입을 문자열로 변환
df['column_name'] = df['column_name'].astype(str)
문자열 = df['column_name'].astype(str)

 

4.1.3. 부등 소수점

# 특정 열의 데이터 타입을 부동 소수점으로 변환
df['column_name'] = df['column_name'].astype(float)
부등 소수점 = df['column_name'].astype(float)

5. 인코딩

5.1. 인코딩이란?

  • 정의
    • 범주형 데이터를 수치형 데이터로 변환하는 과정
    • 머신러닝 모델은 수치형 데이터를 입력으로 받기 때문에 범주형 데이터를 수치형으로 변환하는 것이 필요

 

5.2. 인코딩 방법

# 범주형 데이터를 더미 변수로 변환
df_encoded = pd.get_dummies(df, columns=['category_column'])

# 결과 출력
print(df_encoded.head())

Pandasget_dummies() 메서드를 사용

범주형 데이터를 더미 변수로 변환 = pd.get_dummies(df, columns=['category_column'])

6. 샘플링

6.1. 샘플링이란?

  • 정의
    • 데이터셋의 크기를 줄이거나 늘리는 과정
    • 데이터셋의 대표성을 유지하면서 데이터의 크기를 조절하는 데 사용

 

6.2. 샘플링 방법

# 데이터셋에서 50% 샘플 추출
df_sampled = df.sample(frac=0.5)

# 데이터셋에서 100개의 샘플 추출
df_sampled_n = df.sample(n=100)

Pandassample() 메서드를 사용

퍼센트 = df.sample(frac=0.5)
개수 = df.sample(n=100)

7. 특징 선택 및 추출

7.1. 특징 선택 및 추출이란?

  • 정의
    • 모델 성능을 높이기 위해 중요한 특징을 선택하거나 새로운 특징을 추출하는 과정

 

7.2. 특징 선택 방법

from sklearn.feature_selection import SelectKBest, f_classif

# 특징 선택 (상위 5개의 특징 선택)
selector = SelectKBest(score_func=f_classif, k=5)
X_new = selector.fit_transform(X, y)

# 선택된 특징의 인덱스
selected_features = selector.get_support(indices=True)
print(selected_features)

PandasScikit-learn을 사용하여 특징 선택을 수행

 

7.3. 특징 추출 방법

# 두 열의 곱을 새로운 특징으로 추가
df['new_feature'] = df['feature1'] * df['feature2']

# 두 열의 합을 새로운 특징으로 추가
df['new_feature_sum'] = df['feature1'] + df['feature2']
두 열의 곱  = df['feature1'] * df['feature2']
두 열의 합  = df['feature1'] df['feature2']

 

❤️‍🔥 WIL : Weekly I Learned

 

금주를 다시 살펴보며 저의 상태를 확인해 볼까요~?

 


2024년 12월 16일 월요일 👍🏻

 

오늘은 하루종일 대체 무얼 한 건지 모르겠어요

하지만!

특강이 되게 많았던 날임에도 불구하고 프로그래머스 문제를 꿋꿋하게 풀어낸 제 자신에게 칭찬해주고 싶은 날이었어요 👍🏻

 


2024년 12월 17일 화요일  🔥

 

멘탈 제대로 나갔던 오늘이었습니다

음,, 왜냐면 오늘 하루종일 백준 문제 두 개밖에 못 풀었거든요

항상 노력하고 따라가려 발버둥 치지만 벽이 느껴지네요 😿

 

한 걸음 다가가면 열 걸음 앞서 나가는 분야인 거 같아서 막막해요

동기 교육생분께 멘탈 케어도 받고, 튜터님께도 멘탈 케어받으니까

다 죽어가던 선인장이 다시 생기를 얻은 느낌이었어요

 

토닥토닥해주시고 챙겨주시니까 감사한 마음에 울컥하더라구요

따듯한 맞이와 말씀을 해주셔서 너무 감사했던 오늘이었습니다

아무 생각 없이 그냥 해보려구요


2024년 12월 18일 수요일 🤭

 

아침부터 정말 좋은 유튜브 영상을 슬랙을 통해 받았어요

덕분에 아침부터, "할 수 있다"는 자신감이 차오른 하루였습니다 🤭

 

막막하다는 생각은 떨쳐낼 수 없지만, 그래도 꾸준히 해내는 제 자신이잖아요

이런 긍정적인 생각들과 멘탈을 가지고 문제와 특강들에 임하니까 하루종일 잘 풀렸어요

프로그래머스 문제도 4문제를 낑낑거리며 풀어냈구요! 문제 접근법도 확실히 눈이 트인 거 같습니다

계속 문제를 풀면서 해결방안을 찾아내는 눈을 키워가려구요

 

그리고

 

 

열심히 한 결과로 어느새 point 1000을 모아서 닭을 샀어요!

 

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

 

또 사고 싶은 게 있기 때문에, 캠프가 끝날 때까지 열심히 하려구요

감사합니다 덕분에 동기부여가 생겼어요 🥰


2024년 12월 19일 목요일 🥰

 

오늘 베이직반에서 배운 컴프리헨션, 위치 인자, 로직 오류, 스코프, LEGB Rule 등을 배웠어요

역시 무엇을 하든지, 개념을 알고 있어야 더 효과적이고 "아하!!"를 느끼는 쾌감이 더 큰 거 같아요

너무 재밌더라구요

묵묵히 그냥 흰 도화지에 문제들만 꾹꾹 집어넣었는데, 그간 풀어왔던 문제들이 다시 생각이 나면서 되짚으니까

'이렇게 해도 됐겠다'라는 생각이 들더라구요 너무 즐거운 시간이었어요 ㅎㅎ

머신러닝 때문에 생각이 많아지긴 하지만, 생각해서 바뀔 것도 없고 어차피 해야 한다는 사실도 변함없어서

그냥 하려고요.

안 되면 뭐,, 찾아가서 해결법을 찾으면 되죠~ ㅎㅎ

오늘도 즐거운 하루였습니다.


 

2024년 12월 20일 금요일 🤔

 

오늘은 뭔가,, 한 게 없는 듯한 하루였어요

대체 뭐 했다고 벌써 저녁 시간이 되었을까요?

 

오늘은 Git 특강과 베이직반 수업을 들은 후에 git 설정을 다시 해보고, 머신러닝 이론 공부를 했어요

결측값 처리 방법이랑 이상값 처리 방법에 대해서 고민해 보고 생각해 보았답니다!

시간 너무 빨리 가서 머리가 아플 지경이네요 휴우,,

캠프 시작한 지 한 달이 된 시점이에요! 제가 그간 얼마나 성장했는지 궁금해지네요 🤔

 

확실한 건,

알고리즘 문제를 풀 때, 첫날의 저보다는 지금의 제가 많이 성장한 게 느껴져요

적어 내리는 코드의 수와 길이가 다르거든요 ㅎ

아이공 기특해용~!~!~!

초반에 활활 타올라서 단순히 쉽게 꺼져버리는 촛불이 아닌,

타오르면 타오를수록 더 밝게 빛나는 촛불 같은 제가 되었으면 좋겠네요

 

말이 길어졌네요! 이만 정리하겠습니다

금주도 고생 많으셨고, 갈수록 추워지니 감기 조심하세요!

감사합니다 :)


 

+ Recent posts