반응형
불확실성이 확대되고 미래가 어둡다고 생각되는 2019년이다. 

삶이 녹록치 않음을 느끼는 연령대가 40~50대가 아닐까? 
특히 IMF 전에 취직한 후 현재까지 회사라는 울타리에서 잘 지내다가 정년퇴직, 명퇴 등을 당한 40~50대는 무슨 일을 어떻게 해야할지 막막할 수 있을 것이다.
하지만, 변하는 세상만을 탓하고 있을 필요는 없다고 생각한다. 
이제 스스로 변해야 할 때가 되었다고 믿는다. 
그리고 변화된 나 자신을 만들어 내기 위한 첫걸음이 파이썬이 되길 바란다.   

난 40대 후반 인문학도로 세상의 빠른 흐름에 발 맞추기 위해 파이썬으로 데이터 분석에 도전하려고 하고 있다. 

그 이유는 무엇일까? 
  
디지털 시대로 전환하는 격변의 시대를 대비하기 위해서는 데이터 분석이 꼭 필요하게 되었기 때문이다. 늦은 나이란 없다고 생각한다. 그리고 파이썬은 친근하게 다가갈 수 있다. 그리고 바로 바로 답을 구할 수 있기 때문에, 날마다 꾸준히 도전한다면 본인의 역량을 일취월장시킬 수 있을 것이다.

젊은 친구들 뿐만 아니라 명예퇴직 대상이 된 40대 이상의 중장년층의 실직이 사회적 이슈가 되고 있다. 그만큼 사회 변화가 빠르게 이루어지고 있다고 본다. 
 
위기의 40대, 일자리 불안 커지고 소득은 급감, 막막한 50대, 졸라매도 ‘가난한 노후’ 속수무책이라는 인터넷 기사도 나온다. 
가장 큰 문제는 노후 대책이 전무한 경우가 50%에 육박한다는 것이다. 
40대 이상의 인문학 전공자들은 더욱 설자리가 없기에, 스스로 포기하는 경우도 생긴다.

자포자기하지 말자! 

파이썬과 함께 한다면 40~50대 인문학도도 데이터를 취득하고 분석할 수 있는 역량을 갖춰 사회에 유용한 정보를 제공할 수 있다는 것을 많은 사람들에게 보여주고 싶다.


반응형
반응형

index는 Series 또는 DataFrame에서 값을 찾기 위한 최적화된 도구라고 할 수 있다. 관계형 데이터베이스의 key와 많이 비슷하다고 이해하면 좋을 것 같다.

index 객체는 변경할 수 없다는 특징을 갖고 있다. 

또한, pandas에서 데이터 값들을 검색할 때는 index를 통해 검색하는 것이 컬럼을 가지고 검색하는 것보다 5배 정도 속도가 빠르다

* jupyter notebook에서 %timeit을 사용해 실행 속도를 시뮬레이션할 수 있음.


그렇기 때문에 pandas를 많이 사용하는 경우, index를 목적에 맞게 잘 생성하고 검색하는 데 이용할 수 있도록 할 필요가 있다.

그럼 먼저 pandas index 유형을 정리해 보도록 하자.

 

pandas index 유형

1. Int64Index 

정수 값을 위한 특정 Index로, 64비트 정수형의 불변하는 배열로 되어 있음. 

2. RangeIndex

Int64Index를 최적화한 Index로 최근에 추가됨. (start, stop, step) 특정 정수 값에서 시작하고 끝낼 수 있으며, 간격을 정할 수 있는 정수 기반 Index임. 

3. IntervalIndex

0.0~0.5와 같은 간격 인터벌을 Index로 사용할 수 있음.

4. DatetimeIndex 

나노초 타임스탬프를 저장함.
다음 code는 전체 5시간을 한시간 간격으로 된 index를 생성함.

4. PeriodIndex

년, 월, 날과 같은 기간 데이터를 위한 특정 Index임.

5. MultiIndex

단일 축에 여러 단계의 색인을 표현하는 계층적 Index 객체


반응형
반응형

Pandas에서 데이터 분석을 하기 위해 가장 많이 사용하는 것이 DataFrame일 것이다. 

Series를 확장한 것이 DataFrame이라고 이해하면 좀 더 쉽게 다가올 것이라 생각한다. 

기본 속성들을 정리해 보도록 하자.

>> import pandas as pd # pandas 라이브러리를 읽어들임

>> import numpy as np # numpy 라이브러리를 읽어들임


>> df = pd.DataFrame(np.arange(1, 6)) # numpy 배열(1에서 5까지)로부터 data frame을 생성함

>> df = pd.DataFrame(np.array([[70, 71], [90,91]]), columns=['Missoula', 'Philadelphia']) # columns 속성을 사용해 컬럼을 특정할 수 있음.

>> len(df) # 열이 얼마인지 확인하기 위해 len() 함수를 사용함.

>> df.shape # shape 속성으로 DataFrame의 치수(2,2)를 확인할 수 있음.


CSV 파일로부터 DataFrame 만들기

>> sp500 = pd.read_csv('data/sp500.csv', index_col = 'Symbol', usecols=[0,2,3,7]) # read_csv 함수로 이미 data폴더에 존재하는 sp500.csv 파일을 읽어들임. index의 컬럼명을 'Symbol'로 특정하고, 컬럼들 중에서 4개(0,2,3,7)의 특정 컬럼을 읽어들임.

>> sp500.head() # head()로 맨 앞 5개 열의 값들을 미리 볼 수 있음.

>> len(sp500) # 전체 열이 얼마인지 알 수 있음.

>> sp500.shape # sp500(DataFrame)의 치수를 확인할 수 있음.

>> sp500.size # size 속성으로 전체 데이터 크기를 알 수 있음(3컬럼* 전체 열의 수)

>> sp500.index # sp500의 index를 볼 수 있음

>> sp500.columns # sp500의 컬럼들의 이름을 확인해 볼 수 있음

* sp500.csv파일 다운로드


DataFrame 내에서 데이터에 접속하기

>> sp500['Sector'].head() # Sector 컬럼의 데이터들을 보여줌

>> type(sp500['Sector']) # type을 통해 각 컬럼의 구조를 알 수 있음(DataFrame의 단일 컬럼은 Series임)

>> sp500[['Price', 'Book Value']].head() # 2개 컬럼명을 통해 2개 컬럼의 앞 5개 열의 값들을 미리 볼 수 있음
>> sp500.Price # 컬럼명에 스페이스(빈칸)를 포함하고 있지 않다면, 콤마와 컬럼명으로 컬럼 데이터를 읽어들일 수 있음


DataFrame의 열 선택하기

>> sp500.loc['MMM'] # .loc[]를 사용해 index 이름으로 각 열을 읽어들일 수 있음
>> sp500.loc[['MMM', 'MSFT']] # 여러 열을 이름 리스트를 사용해 읽어들일 수도 있음
>> sp500.iloc[[0, 2]] # iloc[]를 사용해 위치에 맞는 각 열을 읽어들일 수 있음
 
>> i1 = sp500.index.get_loc('MMM') 
>> i2 = sp500.index.get_loc('A') # index 특정 이름의 위치를 index.get_loc()를 통해 파악한 후 그 값으로 각 열을 읽을 들일 수 있음
>> sp500.iloc[[i1, i2]]

at[]과 iat[]를 사용해 이름 또는 위치로 스칼라 찾기

>> sp500.at['MMM', 'Price'] # index와 컬럼 이름을 모두 사용해 값을 찾아냄 
>> sp500.iat[0, 1] # 열 0, 컬럼1이라는 위치를 사용해 값을 찾아냄

[] 연산자를 사용해 슬라이싱하기

>> sp500[:5] # 처음 5개 열(0~4)을 읽어들임
>> sp500['ABT' : 'ACN'] # ABT 이름부터 ACN 이름까지의 열들을 읽어들임

부울 선택을 사용해 열 선택하기

>> sp500[sp500.Price < 100] # sp500에서 Price 컬럼의 값이 100보다 작은 열들을 선택함

>> r = sp500[(sp500.Price < 10) & (sp500.Price > 6)]['Price'] # Price 컬럼의 값이 10보다 작고 6보다 큰 경우의 Price 컬럼 값들만 선택함

>> r = sp500[(sp500.Sector == 'Health Care') & (sp500.Price > 100.00)][['Price', 'Sector']] # Health Care 섹터에서 Price가 100보다 큰 Price와 Sector 컬럼 값들을 선택함


DataFrame 조작하기

컬럼명 바꾸기

>> newSP500 = sp500.rename(columns={'Book Value' : 'BookValue'}) # 공백이 있던 컬럼명을 rename() 메서드를 사용해 변경함. 단, 이 방법으로는 변경된 컬럼명을 가진 복사본을 돌려줌.

>> sp500.rename(columns = {'Book Value' : 'BookValue'}, inplace=True) # 복사본이 아닌 원본에서 컬럼명을 변경하려면 inplace=True 파라미터를 사용해야 함


[]와 .insert()로 새로운 컬럼 추가하기

>> sp500_copy = sp500.copy() # copy()로 복사본을 만들 수 있음
>> sp500_copy['RoundedPrice'] = sp500.Price.round() # Price 컬럼 값을 반올림한 신규 컬럼 RoundedPrice를 생성함
>> sp500_copy.insert(1, 'RoundedPrice', sp500.Price.round()) # .insert()를 사용해서 동일하게 신규 컬럼을 생성할 수 있음

연결(concatenation)을 사용해 컬럼 추가하기

>> rounded_price = pd.DataFrame({'RoundedPrice' : sp500.Price.round()}) # RoundedPrice 컬럼을 갖고 있는 DataFrame을 생성함
>> concatenated = pd.concat([sp500, rounded_price], axis=1) # y축(axis=1)을 기준으로 해서 두개의 DataFrame을 연결함. 

컬럼 지우기

del 키워드 또는 .pop() 또는 .drop()를 사용해 DataFrame으로부터 컬럼을 삭제할 수 있다. 

>> copy = sp500.copy()
>> del copy['BookValue']

>> copy = sp500.copy()
>> popped = copy.pop('Sector')

>> copy = sp500.copy()
>> afterdrop = copy.drop(['Sector'], axis = 1)



반응형
반응형

Pandas 자료 구조는 Series와 DataFrame을 말한다고 생각하면 된다. 그 정도로 이 두가지에 익숙해지면 pandas를 잘 활용한다고 할 수 있다는 것이다.

1. Series 정의

Series는 pandas의 기본 블록이라고 할 수 있다. 

일련의 객체를 담을 수 있는 1차원 배열과 같은 자료 구조를 나타낸다. 

Series 객체의 문자열 표현은 왼쪽에 색인(index)을 보여주고 오른쪽에 해당 색인의 값(values)을 보여준다. 

즉, Series의 배열과 색인 객체는 각각 values와 index 속성을 통해 얻을 수 있는 것이다.


2. Series 만들기

>> import pandas as pd # 사용할 라이브러리를 불러온다(이미 설치되어 있다고 가정).

>> import numpy as np

Series는 리스트, 딕셔너리, NumPy 함수, 스칼라 값들로부터 만들 수 있다.

>> pd.Series([10, 11, 12, 13, 14])

>> pd.Series(list('abcde'))

>> pd.Series({'Mike': 'Dad', 

'Marcia' : 'Mom',

'Mikael' : 'Son',

'Bleu' : 'Best doggie ever'})

>> pd.Series(np.arange(4, 9))

>> pd.Series(np.linspace(0, 9, 5))


기본적으로 index 속성을 가지고 index를 지정할 수도 있다.

>> s = pd.Series([1, 2, 3, 4], index = ['a', 'b', 'c', 'd'])


3. Series의 속성들

아래 속성들을 가지고 여러 작업을 해 볼 수 있다.

>> s.values # 값을 확인할 수 있다.

>> s.index # 인덱스를 볼 수 있다.

>> len(s) # 아이템 수를 확인할 수 있다.

>> s.size # 위와 동일하게 아이템 수를 확인할 수 있다.

>> s.shape # 아이템 수와 빈값으로 된 두개 값의 튜플로 돌려준다.

>> s.head(n = 3) # 앞의 3열을 미리 볼 수 있다.

>> s.tail(n= 2) # 뒤의 2열을 미리 볼 수 있다.

>> s.take([1, 3]) # 2번째와 4번째 열 등 지정한 특정 열의 아이템을 볼 수 있다(0부터 시작한다).

>> s['a'] # a 레이블의 값을 돌려준다.

>> s.iloc[[0,2]] # 특정 위치의 값을 찾아 돌려준다.

>> s.loc[['a', 'd']] # 특정 레이블의 값을 돌려준다.

  

4. Series를 부분집합으로 나누기

>> s = pd.Series(np.arange(100, 110), index = np.arange(10, 20))

>> s[1:6] # 두번째 값(0부터 시작하기 때문에)부터 5번째 값(맨 마지막 값은 제외)까지 돌려준다.

>> s.iloc[[1, 2, 3, 4, 5]] # 지정한 위치의 값들은 모두 돌려준다.

>> s[1:6:2] # 두번째 값부터 5번째 값 중에서 2씩 건너 뛰어 돌려준다(1, 3, 5번째 값).

>> s[:5] # 첫번째 값부터 네번째 값까지 돌려준다.

>> s[4:] # 다섯번째 값부터 마지막 값까지 돌려준다.

>> s[::-1] # 마지막 값에서 첫번째 값까지 거꾸로 돌려준다.

>> s[-4::] # 마지막 4개 값들을 돌려준다.


일련의 날짜 값들을 가지고 작업할 수 있다.

>> dates = pd.date_range('2018-03-01', '2018-03-06')

>> temps1 = pd.Series([20, 22, 25, 30, 23, 27], index = dates)

>> temps2 = pd.Series([10, 15, 13, 19, 13, 17], index = dates)

온도 값 차이를 아래와 같이 다른 변수에 저장할 수 있다.

>> temp_diffs = temps1 - temps2

평균값도 계산 가능하다.

>> temp_diffs.mean() 


5. 불린(Boolean) 선택으로 자료를 찾기

>> s = pd.Series(np.arange(0, 5), index=list('abcde'))

>> logical_results = s >= 3

>> s[logical_results] # logical_results 값이 참(true)인 열들만 돌려준다.

>> s[(s >= 2) & (s < 5)] # s값이 2보다 크거나 같고 5보다 작은 열들을 돌려준다.

>> (s >=0).all() # 참(true)을 돌려준다.

>> (s < 2).any() # 참(true)을 돌려준다.

>> (s < 2).sum() # 조건에 맞는 값들의 합을 돌려준다.


<Source : Learing Pandas Second Edition, Packt>














반응형
반응형

요즘 데이터 분석 공부를 하면서 pandas를 거의 매번 사용하게 된다. 그만큼 파이썬에서는 필수적인 라이브러리가 되었기 때문이 아닐까 한다. 

그럼 가장 기본이 되는 데이터 읽는 방법부터 정리해 보도록 하자.

pandas에서는 위와 같은 명령어를 통해 다양한 파일 형태를 읽어들이고, 쓸 수 있다.

그럼 먼저 가장 많이 사용하는 CSV 파일 읽어들이기를 중심으로 정리해 보도록 하겠다.

 

1. CSV와 텍스트 파일들

보통 데이터는 일반적으로 표 형식으로 사용한다. 한 행에 있는 값이 쉼표로 구분되면 CSV(쉼표로 구분된 값)형식이 된다. 이 형식은 아마 가장 잘 알려져 있고 가장 많이 사용하는 형식일 것이다.

다른 표 형식의 데이터는 공백이나 탭으로 구분할 수도 있으며 일반적으로 다양한 유형의 텍스트 파일(일반적으로 .txt 확장명)에 포함되어 있다. 

이 유형의 파일은 가장 일반적인 데이터 소스이며 쉽게 기록하고 해석할 수 있다.

이와 관련하여 pandas는 이 유형의 파에에 대해 특정 기능 세트를 제공한다.

- read_csv

- read_table

 

2. CSV 또는 텍스트 파일에서 데이터 읽기

>> import pandas as pd

S&P500 지수 데이터를 읽어온다(investing 사이트에서 추출).

각 필드는 심볼과 회사 이름, 사업분야, 사업세부분야로 구분되어 있는 CSV 파일이다(이는 기존에 추출해서 저장함. 어떤 CSV파일이든 상관없음).

>> csv_file = pd.read_csv('data/sp500.csv', names = ['symbol', 'name', 'sector', 'industry'])

여기서 읽어들인 데이터의 컬럼들의 헤더명을 설정하기 위해 names=[]을 사용한다.

>> csv_file

알수도 있지만, CSV 파일에서 데이터를 읽어들이는 다른 방법이 있다. CSV파일은 같은 열의 값이 쉼표로 구분된 표로 만들어진 데이터다. CSV파일은 텍스트 파일로 간주되므로 read_table()함수를 사용할 수도 있다(구분기호를 지정하여).

반응형

>> pd.read_table('data/sp500.csv', sep=',')

위 예에서, 모든 컬럼의 헤더 이름을 names=[]로 정의했다. 만약, 정의하지 않고 그냥 읽어들이면 첫번째 열이 컬럼의 헤더 이름이 된다. 그렇기 때문에 첫번째 열을 헤더로 설정하지 않기 위해서 names=[]로 정의하던지, 컬럼 수를 파악하기 어려울땐 header=None을 사용해서 컬럼들에 0으로 시작하는 기본 이름을 할당해야 한다. 또 하나 주어진 컬럼을 인덱스로 변환해서 계층형 인덱스로 할당하기 위해서는, read_csv()에 index_col 옵션을 추가함으로써 수행할 수 있다.

3. 텍스트 파일을 읽기 위해 RegExp 사용하기

콤마와 세미콜론으로 분리된 경우 말고, 다른 구분기호를 사용한 데이터를 읽어들여야 할 경우도 있다. 이 경우 정규표현식이 우리에게 도움이 된다. 사실 sep 옵션을 사용하여 read_table() 암수에서 정규표현식을 지정할 수 있다.

[0-9] 또는 [a-zA-Z] 등은 무척 자주 사용하는 정규 표현식이다. 이렇게 자주 사용하는 정규식들은 별도의 표기법으로 표현할 수 있다. 다음을 기억해 두자.

  • \d - 숫자와 매치, [0-9]와 동일한 표현식이다.
  • \D - 숫자가 아닌 것과 매치, [^0-9]와 동일한 표현식이다.
  • \s - whitespace 문자와 매치, [ \t\n\r\f\v]와 동일한 표현식이다. 맨 앞의 빈 칸은 공백문자(space)를 의미한다.
  • \S - whitespace 문자가 아닌 것과 매치, [^ \t\n\r\f\v]와 동일한 표현식이다.
  • \w - 문자+숫자(alphanumeric)와 매치, [a-zA-Z0-9]와 동일한 표현식이다.
  • \W - 문자+숫자(alphanumeric)가 아닌 문자와 매치, [^a-zA-Z0-9]와 동일한 표현식이다.

<정규표현식 출처 : 점프 투 파이썬 https://wikidocs.net/4308>

skiprows 옵션을 사용하면 원하는 모든 행을 제외할 수 있다. 이 옵션을 사용할 때 주의할 사항이 있다. 첫번째부터 다섯 줄을 제외시키려면 skiprow=5라고 써야 하지만, 다섯번째 줄만 제외하려면 skiprows =[5]라고 써야 한다.

 

4. 텍스트 파일에서 일부분만 읽어들이기

대용량 파일을 처리하거나 이러한 파일의 일부에만 관심이 있는 경우 파일을 부분(청크)으로 읽어야 한다. 이는 반복을 적용하기 위한 것이고 전체 파일을 파싱하는데 관심이 없기 때문이다. 

예를 들어, 파일의 일부분만 읽으려는 경우 구문 분석을 할 줄수를 명시적으로 지정할 수 있다.

>> pd.read_csv('test.csv', skiprows=[2], nrows=3, header=None)

       0    1    2    3      4

0     1    5    2    3   cat

1     2    7    8    5   dog

2     2    2    8    3 duck

nrows 옵션은 읽을 파일의 행 수를 말한다. 대용량 파일을 읽는 데 유용하다.

 

<Source : Python Data Analytics, Apress>

 

 

반응형
반응형

pandas로 데이터 분석을 실행함에 있어, 어떻게 절차를 구분하는 것이 좋을지 정리해 놓은 글이 있어 번역해 보았다. 

특히 Pandas로 실행하고 있기 때문에 향후 pandas의 각 기능에 대해 정리해 보려고 한다.

먼저, 오늘은 데이터에서 필요한 정보를 만들어내는 7단계에 대해 간략히 정리하도록 하겠다.

데이터 분석 프로세스




1. 개념화(Ideation)

첫단계는 알아내고 싶은 것이 무엇인지 밝히는 것이다. 

이것은 우리가 하고 싶은 것이 무엇인지 생각해 보고 증명하기 위한 개념화에 대한 것이다. 개념은 일반적으로 지식을 바탕으로 결정을 내리기 위해 사용할 수 있는 데이터 패턴에 대한 가설과 관련이 있다. 

이러한 결정은 비즈니스 차원에서 이루어 지지만 과학 및 연구 분야에서도 발생한다. 

그럼 데이터를 통해 우리가 내리는 결정의 종류는 어떤 것이 있을까? 다음과 같은 것을 많이 요청한다고 본다.

- 어떤 일이 왜 일어났는가?

- 과거 데이터를 사용해서 미래를 예측할 수 있는가?

- 앞으로 어떻게 운영을 최적화할 수 있을까?

위 목록이 개념화를 정의하려는 노력에 있어 많은 부분을 차지할 것이라 생각한다. 

위와 같은 질문에 대한 답변을 얻기 위해 문제와 관련된 데이터를 수집하고 이해해야 하는 것이다. 여기에는 어떤 데이터가 조사될 것인지, 연구의 이점이 무엇인지, 데이터를 어떻게 얻을 것인지, 성공 기준이 무엇인지, 최종적으로 정보가 어떻게 전달될 것인지를 정의해야 하는 지를 포함한다.

Pandas 자체는 개념을 보조하기 위한 도구를 제공하지는 않는다. 그러나 Pandas 사용에 대한 이해와 기술을 습득하면 Pandas가 아이디어를 공식화하는 데 어떻게 도움을 주는지 자연스럽게 알게될 것이다.


2. 검색(Retrieval)

아이디어가 있으면 가설을 뒷받침할 데이터를 찾아야 한다. 

이 데이터는 조직 내에서 또는 외부 데이터 공급자로부터 가져올 수 있다. 이 데이터는 일반적으로 보관된 데이터로 제공되거나 실시간으로 제공될 수 있다.

데이터를 작성했거나 조직 내에서 가져온 경우에도 원시 데이터는 종종 매우 불완전하다. 원시 데이터는 데이터가 혼란스럽거나 다양한 형식일 수 있으며 오류가 있을 수 있음을 의미한다. 분석 지원과 관련하여 불완전할 수 있으며 수동으로 개선해야 할 수도 있다.

세상에는 무료 데이터가 아주 많다. 많은 데이터는 무료가 아니며 실제로는 상당한 금액의 비용을 요구한다. 일부는 공개 API에서 무료로 사용할 수 있으며 다른 일부는 구독으로 사용할 수도 있다. 비용을 지불한 데이터는 종종 더 클린하지만 종종 그렇지 않을 수도 있음을 알아야 한다.

데이터가 불완전하거나 클린할 경우 모두 pandas는 다양한 출처의 데이터를 검색할 수 있는 견고하고 사용하기 쉬운 도구 집합을 제공하며 다양한 형식을 지원한다. pandas는 데이터를 검색할 뿐만 아니라 다른 툴이나 프로그래밍 언어에서 필요할 수 있는 복잡한 코딩을 수동으로 생성할 필요없이 pandas 데이터 구조를 통해 데이터의 초기 구조화 기능을 제공한다.


3. 준비(Preparation)

준비 중에 원시 데이터를 탐색할 준비가 된다. 이 준비 과정은 매우 흥미로운 과정이다. 데이터가 품질과 관련된 문제로 가득차 있는 경우가 매우 빈번하기 때문이다. 이러한 품질 문제를 처리하는 데 많은 시간을 할애할 가능성이 높다(종종 매우 아까운 시간).

왜 시간을 많이 할애해야 할까?

- 데이터가 단순히 잘못되어 있다

- 데이터 세트의 일부가 누락되어 있다

- 분석에 적합한 측정 값을 사용하여 데이터가 표현되지 않았다

- 데이터가 분석에 적합하지 않은 형식이다

- 데이터가 분석에 적합하지 않은 세부 수준에 있다

- 필요한 모든 필드가 단일 소스에서 제공되는 것이 아니다

- 데이터 표현이 공급자에 따라 다르다


4. 탐색(Exploration)

탐색에는 대화식으로 데이터를 작은 여러 조각들로 분해한 후 다양한 시각으로 볼 수 있게 함으로써 신속하게 살펴보는 것을 포함한다. 

탐색은 다음과 같은 다양한 테스크를 포함한다.

- 변수가 서로 어떻게 관련되어 있는지 조사

- 데이터 배포 방법 결정

- 특이점 찾아서 제외시키기

- 빠른 시각화 만들기

- 보다 영구적으로 상세한 모델링 프로세스를 지원할 수 있도록 새로운 데이터 표현이나 모델을 신속하게 생성

탐색은 pandas의 위대한 강점 중 하나다. 탐색은 대부분의 프로그래밍 언어에서 수행할 수 있지만 pandas가 얼마나 탐색적 노력을 수월하게 하는지가 관건일 것이다.

IPython 및 / 또는 Jupyter 노트북의 REPL (read-eval-print-loop) 특성과 함께 사용하면 pandas는 매우 자유로운 탐색 환경을 만든다. pandas 구문의 표현력을 통해 복잡한 데이터 조작 구조를 간략하게 설명할 수 있으며 데이터를 처리할 때 수행한 모든 작업 결과가 즉각적인 검사를 통해 표시될 수 있다. 이를 통해 프로그램을 다시 컴파일하여 재실행하지 않고 방금 수행한 작업의 유효성을 신속하게 판별할 수 있다.


5. 모델링(Modeling)

모델링 단계에서 탐색 중에 발견된 발견을 공식화하여 데이터 내에 포함된 원하는 의미를 얻는 데 필요한 단계와 데이터 구조를 명시적으로 설명한다. 이 모델은 원시 데이터에서 정보와 결론까지 얻을 수 있는 코드 단계 뿐 아니라 두 데이터 구조의 조합이다.

모델링 프로세스는 데이터 탐색을 통해 분석을 지원하는 데 필요한 변수를 선택하고 분석 프로세스에 대한 입력 변수를 구성한다. 모델을 실행하며 모델이 원래의 가정을 얼마나 잘 지원하는지를 결정하는지 확인하는 반복 프로세스라고 할 수 있다. 데이터 구조의 공식 모델링을 포함할 수 있지만 통계, 기계 학습 및 운영 연구와 같은 다양한 분석 도메인의 기술을 결합할 수도 있다.

이를 촉진하기 위해 pandas는 광범위한 데이터 모델링 기능을 제공한다. 데이터 탐색으로부터 한발 더 나아가, DataFrame에서 데이터 모델을 형식화하고, 이 모델들을 간결하게 만들어 주는 절차를 확보해 주는 단계라고 할 수 있다. 파이썬 기반을 통해, 처음부터 마지막 프로세스까지 자동화하는 프로그램을 생성하는 파워를 사용할 수 있다. 즉, 작성한 모델은 실행 가능한 것이다.

분석적 관점에서 pandas는 다양한 유형의 문제에 대한 목표를 달성할 수 있는 기술 통계에 대한 통합 지원과 같은 몇 가지 기능을 제공한다. 그리고 pandas는 파이썬 기분이기 때문에 고급 분석 기능이 필요하다면 광범위한 파이썬 라이브러리와 쉽게 통합될 수 있다.


6. 프리젠테이션(Presentation)

이 프로세스의 마지막에서 두번째 단계는 결과를 다른 사람들에게, 일반적으로 보고서나 프리젠테이션 형태로 제시하는 것이다. 설득력있고 철저한 솔루션 설명을 만들고 싶을 때, 바로 이용할 수 있다. 

Jupyter Notebook은 pandas 분석을 위한 프리젠테이션을 작성하는 강력한 도구다. 이 노트북은 코드를 실행하고 응용 프로그램의 여러 지점에서 주석을 달고 실행을 설명하기 위한 다양한 마크다운 기능을 제공한다. 또한 이 도구는 코드, 스타일이 지정된 텍스트, 그래픽과 함께 시각적으로 풍부한 매우 효과적인 실행 가능한 프리젠테이션을 만들 수 있다.


7. 재생산(Reproduction)

중요한 연구는 연구를 공유하고 재현할 수 있게 만들어야 한다. 다른 연구자가 실혐과 결과를 재현할 수 없다면 어떤 것을 증명하지 못했다고 할 수 있기 때문이다.

다행스럽게도 pandas와 파이썬을 사용함으로써 분석을 쉽게 재현할 수 있다. pandas 코드를 구동하는 파이썬 코드와 데이터를 공유함으로써 가능하다.

또한, Jupyter Notebook은 다른 사람들과 쉽게 공유할 수 있는 방법으로 코드와 응용 프로그램을 패키징하는 편리한 방법을 제공한다.


<Source : Learning pandas Second Edition, Packt>


반응형
반응형

요즘 파이썬을 공부하면서 조금 지쳐버린 것 같습니다. 

Udacity 공부 진도도 맞추지 못하고 있고, 하루에 1시간 이상 코딩을 하기로 했는데, 쉽게 되질 않습니다.

그래서, 다시 마음을 잡기 위해 제 자신에게 물어 봅니다.

파이썬으로 대체 무엇을 만들려고 하는가? 입니다. 바로 머리 속에 떠오르질 않습니다. 

그건 구체화된 목표가 없기 때문이 아닌가 싶구요. 


그래서, 파이썬으로 할 수 있는 일이 무엇인지 구글링해 봅니다.


대부분 동일한 내용으로 포스팅하고 있더라구요.

- 시스템 유틸리티 제작

- GUI 프로그래밍

- 웹 프로그래밍

- 데이터 분석

- 사물인터넷(IOT에 적당한 라즈베리파이 등)

- 봇 개발

- Crawler

- 빅데이터 분석

- AI(머신러닝-딥러닝) 구현

그럼, 왜 100여종이 넘는 프로그래밍 언어 중에서 많은 사람들이 

파이썬을 왜 배우는 걸까요? 


일단 직관적인 문법을 갖고 있고, 배우기 쉽다는 점을 듭니다.

그리고, 무료지만 강력하고, 빠른 개발속도, 강력한 커뮤니티, 풍부한 라이브러리를 가지고 있다는 장점을 꼽습니다. 

이런 장점을 바탕으로 빠른 프로토타입을 만드는데 유리하다는 점이 린 스타트업으로 새롭게 무언가를 해보려는 사람들에게 가장 잘 어울리는 언어로 부상한 것이 아닌가 싶습니다.


이렇게 정리하다 보니, 문득 디지털 노마드가 되고 싶은 저 자신에게 묻게 됩니다. 

넌 파이썬으로 무엇을 하려고 하니?

요즘 지치고 힘든 이유가 AI(머신러닝, 딥러닝 등)에 대한 글만 집중해서 보다보니 길을 잃어서 그런 것은 아닌지 자문합니다.

그리고, 다시 옷깃을 다잡아 봅니다, 이 정체기를 견뎌내야 한다고 믿으며...


그럼, 이 시기를 어떻게 보내야 할까?

정체의 시간을 그냥 흘려보내지 말아야 한다고, 기다리면서 반발짝이라도 앞으로 꾸준히 나아가야 하지 않을까요...

그리고, 지속적인 자기계발이 필요하다고... 이 분야의 전문가가 되기 위해 꾸준히 연구하고 내 것으로 만들기 위해 정리하는 작업을 언제나 우선순위에 두어야 한다는 것입니다.

마지막으로, 제가 앞으로 디지털 노마드로 살아가기 위해서는, 미래의 먹거리(상품)을 만들어야 하고 비즈니스로(돈이 되게) 풀어내야 한다는 점을 잊지 말아야겠습니다.


지금까지의 사회생활을 돌아보니, 

대학 때는 문학을 공부하였고, 컴퓨터는 중학교때부터 다루었지만, 지금처럼 프로래밍에 대해 고민해 본 적은 없었던 것 같습니다. 

이제, 직장 생활도 18년이나 되었고, 이 생활을 정리할 시기가 오리라는 것도 알고 있습니다. 

제2의 인생에 대한 준비, 제가 하고 싶은 일에 적극적으로 투자하는 인생을 만들어 나가야 하는 시기인 것입니다. 


꾸준히 자기 계발을 한다고 했는데, 정말 앞서가는 다른 분들에 비하면 아직 한참 먼 것 같습니다. 

묵묵히 겸손하게 한 걸음씩 앞으로 나아가도록 하겠습니다.

반응형
반응형

머신러닝 프로젝트 실행(6~7단계)


머신러닝 프로젝트 실행 순서는 

1. 문제를 정의하고 전체 그림 바라보기

2. 데이터 얻기

3. 인사이트를 찾기 위해 데이터 탐색하기

4. 기본 데이터 패턴을 머신러닝 알고리즘에 더 잘 노출할 수 있도록 데이터 준비하기

5. 다양한 모델을 탐색하고 그 중 가장 좋은 모델을 찾기

6. 모델을 알맞게 튜닝하고 멋진 솔루션으로 통합하기

7. 시스템 런칭, 모니터링과 유지하기

입니다.


지금까지, 1~5단계까지 살펴보았습니다. 이제 2단계만 살펴보면 마무리 될 것 같습니다. 


먼저, 

6. 모델을 알맞게 튜닝하고 멋진 솔루션으로 통합하기


이제 유망한 모델들을 가졌다고 가정해 봅시다. 

그럼, 이 모델들을 튜닝하는 것이 필요합니다. 

실행할 수 있는 몇가지 방법을 살펴보도록 하겠습니다.


그리드 서치(Grid Search)


모델 튜닝을 수행하는 한 가지 방법은 하이퍼파라미터 값들의 좋은 조합을 찾아낼 때까지, 수동으로 하이퍼파라미터(hyperparameters)를 사용하는 것입니다. 

이것은 매우 지루한 작업이 될 것이고, 많은 조합을 탐색할만한 시간을 갖고 있지 않을 수도 있습니다.

그 대신에, 사이킷런(Scikit-Learn)의 GridSearchCV로 탐색을 하도록 할 수 있습니다. 

해야할 일 전부는 어떤 하이퍼파라미터를 실험하고 싶은지, 어떤 값들을 시험해 보아야 하는지를 알려주는 것입니다. 

그러면, 교차검증(cross-validation)을 사용해, 하이퍼파라미터 값들의 모든 가능한 조합들을 평가할 것입니다. 

예를 들어, 다음의 코드는 RnadomForestRegreesor를 위해 하이퍼파라미터 값들에 대한 최상의 조합을 검색합니다. 

>>> from sklearn.model_selection import GridSearchCV

>>> param_grid = [

{'n_estimators': [3, 10, 30], 'max_features': [2, 4, 6, 8]},

{'bootstrap': [False], 'n_estimators': [3, 10], 'max_features': [2, 3, 4]},

]

>>> forest_reg = RandomForestRegressor()

>>> grid_search = GridSearchCV(forest_reg, param_grid, cv=5,

scoring='neg_mean_squared_error')

>>> grid_search.fit(housing_prepared, housing_labels)


팁) 하이퍼파라미터가 어떤 값을 가져야 할지 알 수 없을 때, 간단한 접근법은 연속적으로 10의 파워를 시도해 보는 것입니다. (또는 더 세분화된 탐색을 원한다면, 더 작은 숫자로 시도: n_estimators 하이퍼파라미터를 가진 위 예에서 보듯이)


위 param_grid는 사이킷런에게 처음에 n_estimators의 모든 3×4 = 12개의 조합과 첫번째 dict에서 특정한 max_features 하이퍼파라미터 값들을 평가하도록 알려줍니다. 

그 다음에 두번째 dict인 모든 2×3 = 6개의 하이퍼파라미터 값들의 조합을 시도합니다. 

하지만, 이번에는 bootstrap 하이퍼파라미터는 True(이 하이퍼파라미터의 기본값이 True임) 대신에 False를 설정합니다.

전체적으로, 그리드 서치(grid search)는 RandomForestRegressor 하이퍼파라미터 값들의 12+6 =18개 조합들을 탐색할 것입니다. 

그리고 각 모델을 5번씩(왜냐하면 five-fold 교차검증을 사용하기 때문) 훈련시킬 것입니다. 

달리 말하자면 전체적으로, 18×5 = 90번의 훈련 라운드가 될 것입니다. 

아주 많은 시간이 걸리겠지만, 아래와 같이 최상의 파라미터 조합을 얻게 될 것입니다.

>>> grid_search.best_params_

{'max_features': 6, 'n_estimators': 30}


팁) n_estimators의 최대값이 30으로 평가되었습니다. 점수가 지속적으로 향상될 수도 있기 때문에, 더 높은 값도 평가해 보아야 할 것입니다.


직접 최상의 평가자(estimator)를 얻을 수도 있습니다.

>>> grid_search.best_estimator_

RandomForestRegressor(bootstrap=True, criterion='mse', max_depth=None,

max_feature=6, max_leaf_nodes=None, min_samples_leaf=1,

min_samples_split=2, min_weight_fraction_leaf=0.0,

n_estimators=30, n_jobs=1, oob_score=False, random_state=None,

verbose=0, warm_start=False)


론 평가 점수들도 이용할 수 있습니다.

>>> cvres = grid_search.cv_results_

... for mean_score, params in zip(cvres["mean_test_score"], cvres["params"]):

...        print(np.sqrt(-mean_score), params)

...

64912.0351358 {'max_features': 2, 'n_estimators': 3}

55535.2786524 {'max_features': 2, 'n_estimators': 10}

52940.2696165 {'max_features': 2, 'n_estimators': 30}

60384.0908354 {'max_features': 4, 'n_estimators': 3}

52709.9199934 {'max_features': 4, 'n_estimators': 10}

50503.5985321 {'max_features': 4, 'n_estimators': 30}

59058.1153485 {'max_features': 6, 'n_estimators': 3}

52172.0292957 {'max_features': 6, 'n_estimators': 10}

49958.9555932 {'max_features': 6, 'n_estimators': 30}

59122.260006 {'max_features': 8, 'n_estimators': 3}

52441.5896087 {'max_features': 8, 'n_estimators': 10}

50041.4899416 {'max_features': 8, 'n_estimators': 30}

62371.1221202 {'bootstrap': False, 'max_features': 2, 'n_estimators': 3}

54572.2557534 {'bootstrap': False, 'max_features': 2, 'n_estimators': 10}

59634.0533132 {'bootstrap': False, 'max_features': 3, 'n_estimators': 3}

52456.0883904 {'bootstrap': False, 'max_features': 3, 'n_estimators': 10}

58825.665239 {'bootstrap': False, 'max_features': 4, 'n_estimators': 3}

52012.9945396 {'bootstrap': False, 'max_features': 4, 'n_estimators': 10}


위 예에서, max_features 하이퍼파라미터를 6으로, n_estimators 하이퍼파라미터를 30으로 설정함으로써 최상의 해결책을 확보할 수 있습니다. 

이 조합의 RMSE 점수는 49,959입니다. 

기본 하이퍼파라미터 값들(점수가 52,634)을 사용한 경우보다 더 좋은 점수를 얻었기 때문에 약간 더 좋아졌습니다. 

성공적으로 최상의 모델로 잘 튜닝했습니다!


팁) 하이퍼파라미터로 데이터 준비 단계 중 일부를 다룰 수 있다는 것을 잊지 마세요. 예를 들어, 그리드 서치(grid search)는 확신할 수 없는 피쳐(feature)를 추가하는 것과는 상관없이 자동적으로 찾아낼 것입니다. 자동으로 간단히 아웃라이어 핸들링, 누락된 피쳐들, 피쳐 선택 등에 대한 최상의 방법을 찾을 수 있도록 사용될 수 있을 것입니다. 


무작위 서치(Randomized Search)

그리드 서치(grid search) 접근법은 앞의 예처럼, 상대적으로 적은 조합을 탐색할 때 좋습니다. 

하지만, 하이퍼파라미터 서치 스페이스가 클때는, 그리드 서치 대신에 RandomizedSearchCV를 사용하는 것을 더 선호합니다. 

이 클래스는 GridSearchCV 클래스와 매우 유사한 방법으로 사용할 수 있습니다. 

하지만 모든 가능한 조합들을 시도하는 대신에, 매 반복시마다 각 하이퍼파라미터에 대해 랜덤한 값을 선택함으로써 주어진 숫자만큼 무작위 조합에 대해 평가합니다. 

이 접근법은 두가지 주요 혜택이 있습니다.

  • 만약 1,000회 반복하도록 무작위 서치를 실행한다면, 이 접근법은 각각의 하이퍼파라미터에 대해 1,000개의 다른 값들을 탐색할 것입니다. (그리드 서치 접근법에서는 각각의 하이퍼파라미터에 대해 단지 몇개의 값들을 탐색)

  • 단히 반복할 숫자를 설정함으로써, 하이퍼파라미터 검색에 할당할 컴퓨팅 자원을 더 잘 컨트럴할 수 있습니다. 


앙상블 메서드(Ensemble Methods)

시스템을 튜닝하기 위한 또 다른 방법은 가잘 잘 수행할 수 있는 모델들을 결합시켜 보는 것입니다. 

그 그룹(또는 "앙상블")은 최상의 개별 모델보다 더 잘 수행할 것입니다(랜덤 포레스트가 의지하는 개별 결정 트리 보다 랜덤 포레스트가 더 잘 수행하는 것과 같음). 

특히, 개별 모델이 매우 다른 형태의 오류를 만드는 경우 더 그렇습니다. 


최고의 모델과 그 모델의 에러 분석하기

가장 좋은 모델을 검사하여 문제에 대한 좋은 통찰을 얻을 수 있습니다. 

예를 들어, RandomForestRegressor은 정확한 예측을 하기 위해, 각 속성의 상대적 중요성을 나타낼 수 있습니다:

>>> feature_importances = grid_search.best_estimator_.feature_importances_

>>> feature_importances

array([  7.14156423e-02,   6.76139189e-02,   4.44260894e-02,

1.66308583e-02,  1.66076861e-02,   1.82402545e-02,

1.63458761e-02,   3.26497987e-01,   6.04365775e-02,

1.13055290e-01,   7.79324766e-02,   1.12166442e-02,

1.53344918e-01,   8.41308969e-05,   2.68483884e-03,

3.46681181e-03])


해당 속성의 이름 옆에 중요도 점수를 표시합시다:


>>> extra_attrivs = ["rooms_per_hhold", "pop_per_hhold", "bedrooms_per_room"]

>>> cat_one_hot_attribs = list(encoder.classes_)

>>> attributes = num_attribs + extra_attribs + cat_one_hot_attribs

>>> sorted(zip(feature_importances, attributes), reverse=True)

[(0.32649798665134971, 'median_income'),

(0.15334491760305854, 'INLAND'),

(0.11305529021187399, 'pop_per_hhold'),

(0.07793247662544775, 'bedrooms_per_room'),

(0.071415642259275158, 'longitude'),

(0.067613918945568688, 'latitude'),

(0.060436577499703222, 'rooms_per_hhold'),

(0.04442608939578685, 'housing_median_age'),

(0.018240254462909437, 'population'),

(0.01663085833886218, 'total_rooms'),

(0.016607686091288865, 'total_bedrooms'),

(0.016345876147580776, 'households'),

(0.011216644219017424, '<1H OCEAN'),

(0.0034668118081117387, 'NEAR OCEAN'),

(0.0026848388432755429, 'NEAR BAY'),

(8.4130896890070617e-05, 'ISLAND')


이 정보를 가지고, 유용하지 않은 피쳐들(features) 일부를 탈락시키고 싶을 수도 있습니다(예,. 분명히 하나의 ocean_proximity 범주만이 정말 유용합니다. 그래서 다른 것들에 대한 탈락을 시도할 수 있습니다).

또한, 시스템에서 발생시키는 특정 에러를 살펴보아야만 합니다. 

그런 다음, 발생 원인을 이해하도록 해야 하고, 그 문제를 어떻게 고칠 수 있는지도 이해해야 합니다(다른 피쳐들을 추가하거나 반대로 불필요한 피쳐들을 제거하고, 아웃라이어를 클리닝 하는 등). 


테스트 셋에서 시스템 평가하기

잠시동안 모델을 조정한 후에, 결국 효율적으로 잘 수행하는 시스템을 갖게 되었습니다. 

이제 최종 모델을 테스트 셋에서 평가해 볼 시간입니다. 

이 프로세스에 있어 특별한 것은 없습니다; 단지 테스트 셋에서 예측변수(predictors)와 레이블을 가져와, 데이터를 변환(fit_transform()이 아니라 transform()을 호출!)하기 위해 full_pipeline을 실행합니다. 그리고, 테스트 셋에서 최종 모델을 평가합니다:


>>> final_model = grid_search.best_estimator_

>>> X_test = strat_test_set.drop("median_house_value", axis=1)

>>> y_test = strat_test_set["median_house_value"].copy()


>>> X_test_prepared = full_pipeline.transform(X_test)

>>> final_predictions = final_model.predict(X_test_prepared)

>>> final_mse = mean_squared_error(y_test, final_predictions)

>>> final_rmse = np.sqrt(final_mse) 

많은 하이퍼파라미터를 튜닝했다면, 성능은 보통 교차 검증(cross-validation)을 사용해 측정한 것보다 조금 나쁠 겁니다

(왜냐하면, 검증 데이터에서 잘 수행되도록 미세 조정되었기 때문에, 알려지지 않은 데이터셋에서는 잘 수행되지 않을 것입니다). 

이 예에서는 그렇지 않습니다만, 이런 경우가 생기면 테스트 셋에서 숫자가 잘 나올 수 있도록 하이퍼파라미터를 조정하는 유혹에 빠지면 안됩니다; 그 개선은 새로운 데이터에 일반화될 것 같지 않기 때문입니다.

이제 프로젝트가 시작되는 시점이 되었습니다: 해결책을 제시하는 것(학습한 것을 강조 표시하고, 무엇이 작동되고 무엇이 안되는지, 어떤 가정들이 만들어 졌는지, 그리고 이 시스템의 한계는 무엇인지), 모든 것을 문서화하고, 분명한 시각화와 쉽게 기억할 수 있는 문구를 가진 멋진 프리젠테이션을 만드는 것이 필요합니다(예,. "중앙 소득은 주택 가격의 가장 중요한 예측 변수 입니다").


7. 시스템 런칭, 모니터링과 유지하

이제 제품화를 위한 솔루션 준비가 필요합니다. 

특히, 제품을 가동함으로써 시스템에 데이터 소스를 입력하고 테스트를 작성하기 위한 준비가 필요합니다.

또한, 시스템을 정기적으로 실제 사용중에 점검할 수 있는 모니터링 코드를 작성하는 것도 필요합니다. 

문제가 생기면 경고도 날려줘야 합니다. 

이것은 갑작스런 작동중단 뿐 아니라, 성능 저하를 잡아내는 데 있어 중요합니다. 

모델은 정기적으로 새로운 데이터로 훈련되지 않으면, 시간이 지남에 따라 모델의 데이터가 "망가지는" 경향이 있기 때문에 매우 일반적입니다.


시스템의 성능을 평가하려면 시스템의 예측을 샘플링하고 그것들을 평가해야 합니다. 이것은 일반적으로 사람의 분석을 요구합니다. 이 분석가들은 현장 전문가일 수도 있고, 크라우드소싱 플랫폼의 작업자일 수도 있습니다(Amazon Mechanical Turk 또는 CrowdFlower 같은). 어느 쪽이든, 사람의 평가 파이프라인을 시스템에 연결해야 합니다. 

또한, 시스템의 입력 데이터 품질을 평가해야 합니다. 

때때로 나쁜 품질 시그널(예., 오작동하는 센서가 무작위 값들을 보내거나, 다른 팀의 결과가 부실해지거나)때문에, 성능이 약간씩 떨어질 것입니다. 

하지만, 시스템 성능 저하에 따른 경고를 받기까지는 딜레이 시간이 걸리 수 있습니다. 

만약 시스템의 입력을 모니터하고 있다면, 이 경고를 더 일찍 잡아낼 수 있습니다. 

특히 입력 모니터링은 온라인 학습 시스템에서 중요합니다.


마지막으로 말할 것은, 일반적으로 새로운 데이터를 가지고 정기적으로 모델을 훈련시키는 것을 원할 것이라는 것입니다.

가능한 한 이 프로세스를 자동화해야 합니다. 

그렇지 않으면, (적어도) 6개월마다 시스템을 고칠 가능성이 큽니다. 

그리고 시스템 성능은 시간이 지남에 따라 크게 변동될 수 있습니다. 

만약 온라인 학습 시스템이라면, 일정한 간격으로 상태 시냅샷을 저장해야만 할 것입니다. 

그렇게 해서, 쉽게 이전의 작동 상태로 되돌아갈 수 있습니다. 


여기까지가 예제를 가지고 학습해 본 머신러닝 프로젝트 실행에 대한 전체 프로세스였습니다. 

여러 번 읽어보고 익혀야 이해가 될 것 같네요. 

앞으로 저도 지금까지 설명한 절차대로 http://kaggle.com과 같은 사이트에서 실습을 진행해 보고 싶습니다.



머신러닝 프로젝트 실행-1

(1~2단계: 1. 문제정의하고 전체 그림 바라보기 / 2. 데이터 얻기바로가기 


머신러닝 프로젝트 실행-2

(3단계: 3. 인사이트를 찾기 위해 데이터 탐색하기바로가기 


머신러닝 프로젝트 실행-3

(4단계: 4. 기본 데이터 패턴을 머신러닝 알고리즘에 더 잘 노출시킬 수 있도록 데이터 준비하기바로가기


머신러닝 프로젝트 실행-4

(5단계: 5. 다양한 모델을 탐색하고 그 중 가장 좋은 모델 찾기바로가기


참고)'Hands-On Machine Learning with Scikit-Learn and TensorFlowchapter 2' 

주피터 노트북에서 볼 수 있는 전체 코드 얻기

반응형

+ Recent posts