Data Preprocessing (Label Encoder, One-Hot Encoder)
·
[AI] - Machine Learning
데이터 전처리는 머신러닝 알고리즘만큼 중요하다. 어떻게 처리하느냐에 따라 모델의 성능을 좌지우지 한다. 이번에는 사이킷런에서 제공하는 전처리 방법인 Label Encoder와 One-Hot Encoder에 대해 포스팅한다. # Label Encodingfrom sklearn.preprocessing import LabelEncoderitems = ['TV', '냉장고', '전자레인지', '컴퓨터']encoder = LabelEncoder()encoder.fit(items)labels = encoder.transform(items)print(labels)print(encoder.classes_)print(encoder.inverse_transform(labels))>>[0 1 2 3]['TV' '냉장고' ..
GridSearchCV
·
[AI] - Machine Learning
GridSearchCV API는 교차검증을 기반으로 하이퍼 파라미터의 최적값을 찾는데 도움을 준다. (Grid는 격자라는 뜻으로, 촘촘하게 파라미터를 입력하면서 테스트를 하는 방식) 예를 들어, 결정 트리 알고리즘의 파라미터 조합을 찾는다고 가정해보자. 그럼 다음과 같은 파라미터가 필요할 것이다.grid_parameters = {'max_depth': [1, 2, 3], 'min_samples_split': [2, 3]} 최적의 파라미터 (max_depth, min_samples_split)의 값을 찾기 위해서는 for문을 사용하여 6번(3 * 2)에 걸쳐 하이퍼 파라미터를 변경하면서 교차 검증 데이터 세트에 수행 성능을 측정한다. 여기에 CV가 3회라면 3개의 폴딩 세트..
QgsFeature 이동
·
[Framework] - QGIS
def canvasReleaseEvent(self, e): self.rubberBand.hide() self.rubberBand.reset() point_release: QgsPointXY = self.toMapCoordinates(e.pos()) displacement_x = point_release.x()-self.point_start.x() displacement_y = point_release.y()-self.point_start.y() geom: QgsGeometry = self.feature.geometry() geom.translate(displacement_x, displacement_y) ..
Stratified K 폴드
·
[AI] - Machine Learning
이전 포스트에서 K 폴드에 대해서 알아봤다. K 폴드의 단점은 치중되어 있는 레이블 데이터 집합을 고려하지 못한 것이다. 이게 무슨 소리인지 극단적인 예시를 들어보겠다. 10 폴드인 상태에서 1억개의 레이블 데이터 세트(분류는 O와 X)가 있고 그중 1번째부터 10번째 데이터는 O, 나머지 9999만 9990개는 X이라고 가정하자.첫 번째 폴드를 검증 데이터 세트로 사용했을 때 1천만개의 데이터중 10개의 O가 있다.하지만, 두 번째 폴드부터는 검증 데이터 세트로 사용할 때 전부 X 밖에 없을 것이다. 이러한 상태를 imbalanced 하다고 표현한다. imbalanced 상태를 위해 적은 레이블을 고르게 분포한 뒤에 K 폴드를 적용한다. import pandas as pdimport numpy as ..
교차 검증 (K-폴드 교차 검증)
·
[AI] - Machine Learning
교차 검증은 오버피팅(Overfitting)을 방지하기 위한 프로세스 중 하나이다. 오버피팅이 발생하는 이유는 모델의 학습이 Training-Set에만 너무 의존되어 있기 때문에 일반화가 잘 이루어지지 않아 다른 데이터가 들어오면 성능이 떨어진다. 그래서 Training-Set을 Training-Set과 Validation-Set으로 세분화하는 것이 교차 검증이다. 이를 세분화해서 무엇을 하느냐? Training-Set으로 학습된 모델을 Test-Set으로 평가하기 전에 Validation-Set으로 평가하는 것이다. 즉, 모의고사를 본다고 생각하면 된다. 우선 K-폴드 교차 검증부터 확인해보겠다.Training-Set을 K등분한다. 예를들어, 100개의 Training-Set이 있다면..K = 1(1~..
Scikit-learn의 주요모듈
·
[AI] - Machine Learning
예제 데이터sklearn.datasets사이킷런에 내장되어 있는 예제 데이터셋피처 처리sklearn.preprocessing데이터 전처리에 필요한 다양한 가공 기능 제공 (원핫인코딩, 정규화, 스케일링..)sklearn.feature_selection알고리즘에 큰 영향을 미치는 피처를 우선순위대로 셀렉션 작업을 수행하는 다양한 기능 제공sklearn.feature_extraction.textsklearn.feature_extraction.image텍스트나 이미지 데이터의 벡터화된 피처 추출ex) 텍스트 데이터의 Count vectorizer, tf-idf vectorizer피처 처리 & 차원 축소sklearn.decomposition차원 축소와 관련한 알고리즘ex) PCA, NMF, Truncated S..
함수형 프로그래밍
·
[Language] - Python
개요함수형 프로그래밍은 프로그램을 수학적 함수의 계산으로 바라보고 상태 변화와 가변 데이터를 최소화하는 프로그래밍 패러다임이다. 일급 시민(first citizen)을 객체 지향 프로그래밍에서는 객체 위주의 사고를 했었다면, 함수형 프로그래밍에서는 함수가 일급 시민이 된다. 즉, 함수를 객체처럼 특정 자료 구조에 담거나 함수의 인자로 전달하는 등의 행위가 가능하다. 함수형 프로그래밍은 아래와 같은 특징들이 있다. 순수 함수 (Pure Function)def add(x, y): return x + y동일한 입력에 대해 항상 동일한 출력을 반환한다. 또한, 함수가 자신의 외부 상태를 변경하지 않으며 사이드 이펙트가 없어야 한다. 예를 들면, 함수 내부에서 전역 변수나 외부 데이터를 수정하지 않아야 한다..
[Tip] if문 분기와 삼항연산자가 사용하기 싫을 때
·
[Language] - Python
개요코드를 작성하다보면 복잡한 도메인 혹은 비즈니스 요구사항에 의해 고려해야할 케이스가 많아지기도 한다. 예를 들면, 팩토리 패턴의 경우, 다양한 케이스 별로 분기하여 대응되는 클래스의 인스턴스를 초기화하는 일종의 공장 역할을 하는 클래스를 분리한다. 하지만, 결국 필자가 생각하기에 if 문 혹은 switch ~ case와 같은 형태의 가독성을 해치는 보일러 플레이트는 여전히 남아있다.다행히도 Python에서는 딕셔너리라는 객체가 존재하고, 메소드 자체를 마치 객체처럼 다룰 수 있는 스크립트의 성질이 있기 때문에 이를 응용하여 if 문 분기를 사용하지 않고도 비교적 깔끔한 코드를 작성할 수 있다. 사용 예시MAP_COLOR = {True: QColor(247, 230, 0), False: Qt.tra..
zip
·
[Language] - Python
개요본 포스트에서는 Python의 zip() 함수에 대해 알아본다. zip() 함수는 iterable(순회 가능한 객체)들을 원소 단위로 묶어주는 역할을 수행한다. zip() 함수를 통해 데이터를 전처리할 때, Pythonic하고 유연하게 수행할 수 있는 장점이 있다. 사용 예시a = ['a', 'b', 'c']b = [1, 2, 3]zip(a, b) # zip() 함수의 반환값은 입력으로 주어진 iterable의 타입이 아닌 zip 타입의 객체가 반환되는 것을 확인할 수 있다. for pair in list(zip(a, b)): print(pair)>>('a', 1)('b', 2)('c', 3)zip 인스턴스를 list로 캐스팅하고 for loop를 돌린 결과 다음과 같이 두 iterator의 ..
property 데코레이터
·
[Language] - Python
개요작업을 하던 도중 처음보는 데코레이터를 발견했다.. 보통 우리는 객체의 필드에 직접 접근하는 것을 방지하기 위해 protected나 private 접근제한자를 사용하고, getter와 setter를 통해서만 접근할 수 있도록 캡슐화(Encapsulation)을 한다. 이러한 과정을 간소화 시켜주는 것이 프로퍼티의 역할이다. 사용 예시class Palette: def __init__(self): self.__color = 'blue' def get_color(self): return self.__color def set_color(self, color): self.__color = color def del_color(self): ..
시점이동, 객체의 필드
·
[Framework] - QGIS
>>> iface.activeLayer().select(42)해당 ID의 객체 선택 >>> iface.mapCanvas().zoomToSelected()선택된 객체로 시점 이동 >>> feat = iface.activeLayer().getFeature(613)>>> fields = feat.fields() # return QgsFields (iterater)해당 객체의 속성들을 받을 수 있다. >>> feat.attribute('Text')해당 객체의 Text 속성에 대한 값
QgsGeometry, asPolyline()
·
[Framework] - QGIS
iface.activeLayer().selectedFeatures()[0].geometry() 선택된 객체들중 첫 번째의 지오메트리 정보를 반환한다. 해당 객체는 선형 객체이기 때문에 LineString 형태를 띄고 있다. iface.activeLayer().selectedFeatures()[0].geometry().asPolyline()[, , , , , , , , , , , ] 선형객체의 각 포인트를 리스트로 반환하려면 asPolyline() 메소드를 사용하면 된다. 각 점들은 QgsPointXY 타입이다.
전략 패턴 (Strategy Pattern)
·
[CS] - Design Pattern
스트레티지 패턴은 행위를 클래스로 캡슐화하여 동적으로 바꿀 수 있게 해주는 패턴이다. 이번 포스트에서는 귀납적으로 코드를 살펴보겠다.public class DuckSimulator { public static void main(String[] args) { Duck mallard = new MarllardDuck(); mallard.performQuack(); // 꽥꽥 mallard.performFly(); // 난다! // 캡슐화된 행위를 바꾸는 부분 mallard.setFlyBehavior(new FlyNoWay()); mallard.setQuackBehavior(new SQuack()); ..
컴포지트 패턴 (Composite Pattern)
·
[CS] - Design Pattern
컴포지트 패턴은 복합 객체와 단일 객체를 클라이언트에서 구별없이 다루게 해주는 패턴이다. (일종의 일반화를 위한 인터페이스를 정의)OCP(Open-Closed Principal)을 준수하기에 용이하다. (변화에는 닫혀있고, 확장에는 열려있다.)public class Computer { private Keyboard keyboard; private Body body; private Monitor monitor; ...}위와 같은 코드는 확장에 용이하지 못하다. 그 이유는 Keyboard, Body, Monitor의 공통된 타입이 존재하지 않기 때문이다.(컴퓨터라는 전체 시스템의 부분집합이라는 공통점이 존재함에도 불구하고) 단점 : 공통점(부분집합)으로 묶은 인터페이스에 공통되는..
Linux 환경변수에 관련된 총 정리
·
[ETC] - Linux
1. '~' 의 의미/Users/사용자명/ : 사용자의 홈 디렉터리를 의미한다. 2. ls -alist all 옵션을 의미한다. 홈 디렉터리에서 환경변수를 추가해주기위한 .bash_profile 파일이 있을 것이다. 만약 존재하지 않는다면 touch .bash_profile 명령어를 통해 새로 생성해주자. 3. vi .bash_profilevi 에디터를 통해 환경변수를 관리하는 파일을 수정한다. vi 에디터는 일반 에디터와 다르게 편집모드와 명령모드로 구분된다. 기본적으로 명령모드이며 편집모드에 진입하려면 i (insert)를 눌러야 한다. 반대로 명령모드로 돌아오려면 esc를 누르면 된다. 명령모드 상태에서 명령어를 쓰려면 : 를 쓴다. 그후 명령어들을 쓴다. 주로 쓰는 명령어는 q(그냥 종료), wq..
덕 타이핑 (Duck Typing)
·
[Language] - Python
개요필자는 스트래티지 패턴을 공부하던 도중 인터페이스를 사용하는 예제를 보았다. 그러자 갑자기 의구심이 들었다. Python에는 인터페이스가 없나?? 그래서 바로 구글링을 했다. 그리고 다음과 같은 답변을 보았다. 파이썬이 다중 상속이 가능한 것은 알고있었지만 덕 타이핑? 이라는 말은 처음 들어봤다. 그래서 바로 또 서칭서칭! Duck Typing - 'If it walks like a duck and it quacks like a duck, then it must be a duck' 해석해보면 '오리처럼 걷고, 오리처럼 꽥꽥거리면, 그것은 틀림없이 오리다.' 라는 뜻입니다. 그렇다. 필자는 오리를 매우 좋아한다. 그게 중요한게 아니라 Python은 객체의 타입보다 행위를 더 중요하게 여긴다는 의미이다...
추상 베이스 클래스 (Abstract Base Class)
·
[Language] - Python
개요디자인 패턴을 공부하면서 구체화 되어 있는 것 보다 추상화된 것에 의존하라는 원칙(의존성 역전, Dependency Inversion)을 알게 되었다. 그러나 대부분의 디자인 패턴 포스트를 확인해보면 자바로 설명이 자주 쓰여있어서 필자는 Python에 추상 클래스가 없는지 궁금했다. 그리고 Python에도 추상 클래스가 있다는 사실!.. 그러나 기본적으로 제공되는 것은 아니다. (인터페이스는 지원하지 않음.) 일단 필자가 생각하는 추상 클래스의 필요성에 대해 말을 해보자면..1. 특정 개념을 추상화 및 일반화하는데에 유리하고,2. 추상 클래스에 속해 있는 추상 메소드는 반드시 구현(오버라이딩)을 해야하므로 개발자가 해당 추상 클래스를 사용할 때 추상 메소드를 구현하지 않고 넘어가는 실수를 방지할 수 ..
closeEvent
·
[Framework] - PyQT
다이얼로그를 띄운 상태에서 해당 다이얼로그를 띄우는 버튼을 누르면 중복되서 띄워지는 현상이 발생했다.. -_-;; 그래서 혼자 예외처리를 한 결과.. if not self.dialog_legend: DialogLegend(....)다이얼로그 객체가 존재하지 않은 경우에만 띄우도록 예외처리를 했다. 그랬더니 문제가 발생했다. 중복되는 현상은 방지할 수 있었지만, 창을 닫고나서 두 번째부터 창을 띄울 수 없게 된 것이다. 이는 다이얼로그 객체가 남아있게 때문에 해당 조건문을 만족시키지 않기 때문이었다. 그렇다면 해당 객체를 없애냐? 그렇게 되면 이벤트가 발생하지 않는 좀비상태로 빠져버리고 말것이다.. 그 순간! 옆에 계신 선배님이 팁을 주셨다. closeEvent class DialogLegend(Q..
django 모델 및 뷰 작성
·
[Framework] - Django
이번에는 모델과 뷰를 작성해볼 것이다. 일단 모델과 뷰가 무엇인지 간단하게 이해해보자. Spring을 한 사람이라면 MVC (Model, View, Controller)라는 개념을 알 것이다. 여기에 django는 MTV (Model, Template, View)가 대응한다. 모델은 데이터베이스의 스키마를 정의하는 것이고, 뷰는 사용자의 요청에 따라 어떻게 처리할 것인지를 로직으로 구현한 부분이라고 생각하면 쉽다. 우선 우리는 두 가지의 모델(데이터베이스 테이블의 스키마)을 정의할 것이다. polls/models.pyimport datetimefrom django.db import modelsfrom django.utils import timezone# Create your models here.clas..
데코레이터 패턴 (Decorator Pattern)
·
[CS] - Design Pattern
데코레이터 패턴은 기능을 동적으로 확장할 때 유용한 패턴이다. 예를 들어보자. A라는 기본기능과 B, C, D라는 추가 기능을 조합할 경우, 경우의 수는 AA + BA + CA + DA + B + CA + B + DA + C + DA + B + C + D 8가지의 경우가 나온다. 그럼 무식하게 메소드만을 활용하여 (상속을 통해) 8가지의 클래스를 정의해서 사용할 것인가? 최악의 경우를 생각해보자. 추가 기능이 1억개면? 답이 없다.. 그래서 메소드가 아닌 인스턴스의 조합을 활용하면 어떨까? 라는 생각에서 나온것이 데코레이터 패턴이다. 첨언을 하자면, DefaultBehavior 클래스는 기본기능이라고 생각하자.public abstract class Base { public abstract v..