분류 전체보기 118

SVM의 가우시안 RBF 커널 간략 정리

sci-kit learn에서 제공하는 SVM 모델 중 SVC 알고리즘은 다양한 커널을 제공한다. 주로 ‘linear’, ‘poly’, ‘rbf’ 이렇게 세 가지가 주로 쓰이는데 SVC 알고리즘을 가져왔다면 주로 ‘rbf’를 쓰기 위함일 경우가 많다. (default값도 rbf이다.) from sklearn.svm import SVC from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler rbf_kernel_svm_clf = Pipeline([ ("scaler", StandardScaler()), ("svm_clf", SVC(kernel="rbf", gamma=1, C=0.001) ]) RBF는 가우시안 방..

키워드를 활용한 간단한 제품 추천 컨텐츠 기반 필터링(CBF)

각 제품을 설명하는 단어 모음이 있다면 간단한 추천 모델 개발이 가능합니다. 아래 예시는 제품별 상세 내역 이미지에서 문장을 추출한 뒤 전처리를 한 결과입니다. prod_seq는 제품별 고유 넘버이며 text_new는 각 제품의 키워드를 담은 리스트입니다. 여기서 인덱싱의 편의를 위해 prod_seq를 index로 설정하였음을 기억해 주세요. 아래 데이터프레임을 df 변수로 지정합니다. 진행 과정은 아래와 같습니다. 1. 키워드를 전부 꺼내 고유값을 제거한 하나의 리스트로 만듭니다. 2. row는 prod_seq로, columns는 각 키워드 하나하나로 구성된 데이터 프레임을 생성합니다. 3. 신규 생성한 데이터프레임에서 제품별 키워드가 존재할 경우 1, 없으면 0으로 표기합니다. 4. 제품 간 코사인 ..

[pandas apply] 텍스트를 일정 길이만큼 잘라서 분리하기

만약 위와 같이 각 seq(시퀀스)별로 엄청 긴 문장의 text가 포함된 df가 있다고 가정합니다. 텍스트를 만약 길이(len) 20 단위로 잘라서 데이터프레임으로 만들기 위해서는 어떻게 해야 할까요? 각 텍스트의 총 길이 보기 df['len'] = df['text'].apply(len) df apply 와 len 함수를 쓰면 간단하게 text의 총 길이를 출력할 수 있습니다. 각 text의 길이를 알면 몇 번 잘라야 되는지 알 수 있기 때문입니다. 저희는 길이 20 단위로 자를 예정이므로 153 // 20을 하면 7이 나오게 되는데 7번 자르면 마지막에 길이 13인 텍스트가 남게되므로 이것도 챙기려면 7 + 1 총 8번 쪼개야 함을 알 수 있습니다. 텍스트 자르기 함수 작성 def func(seq, t..

아직도 셀레니움(Selenium)에서 벗어나지 못했다면...

셀레니움은 최후의 수단 저도 처음에 배울 때는 BeautifulSoup과 Selenium으로 입문했습니다. 사실 셀레니움이 직관적이고, 동적페이지 대응하기도 나름 편하고, 거의 웬만해서는 다 뚫기 때문에 많은 사람들이 쓰는 것 같습니다. 하지만 저는 소제목 그대로 최후의 수단으로 셀레니움을 선택합니다. 우선 태그 찾느라 HTML 처다보고 있는 것도 눈아프고, 인스타와 같이 제대로 관리하는 사이트는 정기적으로 태그명이 바뀌기 때문에 재사용성이 떨어지고, 무엇보다 스크랩 속도가 너무 느립니다. 구글링으로 쉽게 찾을 수 있는 크롤링 예시 중 하나인 스타벅스 매장 주소 스크랩을 예시로 보여드리겠습니다. 예상하기로는 해당 주소로 가서 F12로 inspector창 열어서 "서울", "경기", "광주"...이렇게 태..

엔트로피(Entropy)와 크로스 엔트로피(Cross Entropy)

엔트로피 이전에 정보량에 대해서 이해할 필요가 있다. 어떠한 사건의 확률값에 -log를 취하면 확률이 높아질수록 0에 가까워지고 확률이 낮아질수록 무한대에 가까워진다. 즉 확률이 높을수록 낮은값을 지니도록 설정하기 위한 도구로 -log를 취했다. 그리고 -log p(x) 를 정보량 I(x) 으로 정한다. 정보의 크기(정보량)란? 어떤 정보가 참이라고 가정했을 때 어떠한 사건이 일어날 확률이 매우 낮을수록 큰 정보라고 부른다. 왜냐하면 확률이 낮은 사건은 누구나 알고 있다고 보기 어렵기 때문에 만일 사실일 경우 유익한 정보이기 때문이다. 개인적으로는 정보량을 정보의 가지수로 이해하면 어떨까 싶다. 가령 정보량이 0에 근사하다는 말은 즉 사건 발생 확률이 높다는 것이므로 A라는 사건이 발생할 경우 어떤 결과..

파이썬 groupby로 요소 모아 보기 (단순 집계 이상으로 활용하기)

대부분 groupby 를 활용해서 sum, mean, count, std 출력을 벗어나지 못하리라 생각합니다. 하지만 단순히 groupby로 요소를 그룹화한 결과를 보고 싶으셨던 적 있지 않나요? 예를 들어 회원 정보에서 거주지별로 몇 명이 사는지를 구하는 것이 아니라 거주지 별로 누가누가 사는지 명단을 뽑아보고 싶은 것과 같은 상황 말이죠 타이타닉 예시를 가지고 설명드려볼 수 있을 것 같은데요 df.groupby('Pclass')['Name'].count() Out: Pclass 1 216 2 184 3 491 Name: Name, dtype: int64 위와 같은 방식으로 Pclass(등급)별 탑승 인원 수가 몇명인지 정도를 뽑아보는게 일반적인 경우겠죠? 그런데 각 Pclass에 누가누가 타고 있는지..

이미지 URL에서 이미지 파일 다운받기

아래와 같이 urllib 모듈을 활용하면 이미지 URL에서 이미지 파일을 다운받을 수 있다. import urllib.request url = "이미지URL" urllib.request.urlretrieve(url, '저장경로/저장할파일명.jpg') 하지만 가져오려는 이미지 URL에 한글이 섞여있을 때도 있다. url = 'https://abc.com/group/사진/젓갈01.jpg' 과 같이 말이다 (예시) requests 과정에서 한글이 섞긴 URL을 get하려 할 경우 ASCii 코드 문제를 언급하며 오류가 발생한다. 이럴 경우 아래와 같이 url에서 한글인 부분을 해시코드와 같은 형태로 바꿔주는 작업이 필요하다. def transfrom_url(url): from urllib.parse impor..

NDCG로 랭킹 추천모델 평가하기

NDCG는 추천 모델 중에서도 추천 받는 대상인 유저에게 있어 추천의 순서가 중요한 요소로 작용하는 랭킹 추천 모델에 대한 평가에 활용한다. 그래서 유저와 특정 상품 간의 연관성 또는 각 상품의 선호도 등을 점수로 환산한 뒤 1등부터 K등까지 나열한 결과가 가장 이상적인 추천이라는 가정하에 모델 평가를 진행한다. 쉽게 말해 유저 마음 속 1위에서 K위까지의 상품을 등수 순서에 맞춰 추천해주는 것이 중요하다는 의미이다. 여기서 점수 역할을 해야하는 연관성 또는 선호도를 어떻게 측정할 수 있을까? 웹사이트의 경우 특정 상품에 대한 각 유저의 클릭률, 체류시간 등을 지표로 삼을 수도 있고, 장바구니에 담았는지, 결제 단계까지 이르렀는지 등 유저 행동에 기반한 스코어링을 할 수도 있고, 각 상품에 매긴 평점이나..

딥러닝에는 왜 활성함수를 적용할까?

딥러닝하면 가장 먼저 접하는 저 신경망 그림은 뭔가 복잡해 보이지만 찬찬히 뜯어보면 비교적 단순하다. 위 그림을 직관적으로 받아들여보면 input layer는 우리가 예측 또는 분류할 때 쓸만할 것으로 예상되는 데이터에 해당한다. 즉 집값 예측이라고 한다면 평수, 방 개수 등등이 되겠다. 위 동그라미들을 이어주는 선들은 모두 가중치 $w$에 해당하며 1~8번 input 데이터에 각각 다른 가중치를 곱한 뒤 모두 더하는 내적을 수행한 결과가 hidden layer 1 이 된다. 식으로 표현하기 위해 input 데이터를 $x$라고 한다면 $w_1x_1 + w_2x_2....+b$ 로 표현이 된다. 이 식은 input이 8개 hidden layer 1이 9개 이므로 총 72개의 $w$가 필요할 것이지만 아무리..

하이퍼 파라미터 튜닝에 관하여

하이퍼 파라미터는 머신러닝 과정에서 직접 선택해줘야 하는 값을 의미한다. 여기서 그냥 파라미터와 헷깔릴 여지가 있기 때문에 미리 짚고 넘어가자. 머신러닝에서의 파라미터는 목적함수 $h_{\theta}(x)$의 해($\theta$)를 의미하며, 하이퍼 파라미터는 모델링에서 우리가 직접 선택해야 하는 옵션값들을 의미한다. 어떤 모델을 선택하느냐에 차이가 발생하지만 LGBM 모델의 경우 max_depth, num_leaves, n_estimators 등이 해당하고, SVM의 경우 cost, gamma가 해당하며, DNN의 경우 epoch, batch_size, dropout 등이 해당할 것이다. 각 모델을 깊게 살펴본다면 우리가 손수 설정해야할 하이퍼 파라미터값들이 생각보다 훨씬 많다는 것을 알 수 있을 것이..