반응형

파이썬은 기계 학습 및 데이터 과학에서 가장 인기 있는 언어 중 하나로 부상했습니다. 다양한 기능을 제공하고 다양한 요구를 충족하는 풍부한 머신 러닝 라이브러리 생태계를 제공합니다....라고 하는데. 한번 시작해볼까 하다가도 라이브러리가 너무 많이 존재해서 뭐가뭔지 잘 모르겠네요. 그래서 그 중 가장 유명한 네 가지 파이썬 머신러닝 라이브러리인를 비교해보고자 합니다. 

1. Scikit-learn:

Scikit-learn은 전통적인 기계 학습 작업에 널리 사용되는 라이브러리입니다. 데이터 전처리, 피쳐 추출, 모델 선택 및 평가를 위한 포괄적인 도구 세트를 제공합니다. Scikit-learn의 주요 기능은 다음과 같습니다:
 <장점>

     -  간단하고 직관적인 API를 제공하므로 다양한 수준의 전문 지식을 가진 사용자가 접근 가능. 탄탄한 학습알고리즘.

     -  광범위한 알고리즘 지원: 분류, 회귀, 클러스터링, 차원 축소 등을 포함한 광범위한 기계 학습 알고리즘을 제공

     -  NumPy 및 Pandas와 같은 인기 있는 Python 라이브러리와 원활하게 통합

   <단점>

     - 딥러닝이나 강화학습은 다루지 않음


2. 텐서플로(TensorFlow)


텐서플로는 구글이 개발한 오픈소스 라이브러리이며 머신러닝 / 딥러닝을 쉽게 사용할 수 있도록 다양한 기능을 제공합니다. 데이터 플로우 그래프(Data Flow Graph)구조를 사용하여 풍부한 표현이 가능한 프레임워크입니다. 

   <장점>

     -  계산구조와 목표함수만 정의되면 자동으로 미분계산을 처리함

     -  텐서보드를 통해 파라미터 변화양상 및 DNN 구조를 알 수 있음

     -  이미지 인식, 반복 신경망 구성, 기계 번역, 필기 숫자 판별 등 각종 신경망 학습에 사용

     - 대규모 예측 모델 구성이 뛰어나 테스트부터 실제 서비스까지 거의 모든 딥러닝 프로젝트에 범용적으로 활용 가능

   <단점>

     -  메모리를 효율적으로 사용하지 못하고 있음

     -  Symbolic Loop 기능이 유연하지 못하며, 함수가 있어도 텐서 타입으로만 적용해야 함

     -  딥러닝 모델을 만드는데 기초 레벨부터 작업이 필요하여 초보자가 사용하기 어려움 

 

3. 케라스(Keras)

케라스는 텐서플로의 문제를 해결하기 위한 보다 단순화된 인터페이스를 제공하기 위해 역시 구글에서 개발된 오픈소스 신경망 라이브러리입니다. 케라스에서 제공하는 시퀀스 모델로 원하는 레이어를 쉽게 쌓을 수도 있고, 더 복잡한 모델을 구성할 땐 케라스 함수 API를 활용하여 구성할 수도 있습니다.

   <장점>

     -  매우 쉽게 모델 구현 가능

   <단점>

     -  디테일한 모델링이 불가하며, 코드만 보고 딥러닝 구조를 이해하기 어려움

     -  오류 발생시 케라스 자체의 문제인지, 백엔드 언어의 문제인지 특정하기 어려움

 


4. PyTorch:


PyTorch는 유연성과 동적 계산 그래프를 강조하며, 페이스북의 AI연구팀이 개발한 오픈소스 머신러닝 라이브러리입니다. 사용 편의성과 개발자 커뮤니티가 많아 큰 인기를 얻었습니다. 
   <장점>

     -  코드를 깔끔하고 직관적으로 작성 가능하며, 학습속도도 텐서플로보다 빠름

     -  메모리에서 연산을 하면서도 신경망 사이즈를 최적으로 바꾸면서 동작시킬 수 있음

     -  Numpy를 대체하면서도 GPU를 이용한 연산이 가능

     -  신속한 시제품 제작과 실험을 지원하기 때문에 연구계에서 선호하는 추세

   <단점>

     -  사용자층이 낮고 학습에 필요한 자료와 예제를 구하기 쉽지 않음 

 

 

전체적인 비교를 하자면...


- 학습 곡선: Scikit-learn, Keras
- 딥 러닝 지원: TensorFlow, Keras, PyTorch가 광범위한 신경망 아키텍처와 사전 훈련된 모델 지원
- 성능: TensorFlow 및 PyTorch는 GPU 가속을 활용하여 대규모 모델을 학습하는 데 매우 효율적. Scikit-learn은 CPU 기반이기 때문에 계산 집약적인 작업에 어려움.
- 생태계 및 커뮤니티: Scikit-learn, TensorFlow, Pytorch?

진짜 머신러닝을 공부하게될지는 잘 모르겠지만, 우선 한다면 Tensorflow가 가장 적당해 보이네요. 시간될 때 주가예측 한번 해보면 좋을 것 같습니다.

 

그럼 이만~~

반응형
반응형

시군별 평균수입/총수입 자료를 지도에 매핑해서 나타내보도록 하겠습니다.

 

아래의 자료는 시군별 평균수입/총수입 자료입니다.

aaa.csv
0.00MB

 

한가지 추가로 필요한 파일이 시군구 지형자료입니다. 아래의 파일도 같은 프로젝트 폴더에 저장하고 실행합니다.

skorea_municipalities_geo_simple.json
0.35MB

 

import folium as g
import json
import webbrowser
import pandas as pd

g_map = g.Map(location=[37.4, 127], 
            tiles='cartodbpositron', 
            # tiles = 'Stamen Terrain',
            zoom_start=7)
geo_data = json.load(open('skorea_municipalities_geo_simple.json', encoding='utf-8'))
df = pd.read_csv('aaa.csv', encoding='utf-8', dtype={'code':'str'})
g.Choropleth(geo_data=geo_data,
                data = df,
                columns=['sigun', 'avg_income'],
                key_on='feature.properties.name',
                fill_color='YlGn',
                fill_opacity=0.8
            ).add_to(g_map)
            
g_map.save('map.html')
webbrowser.open_new_tab('map.html')

fill_color옵션으로 색상 스타일을 변경할 수 있습니다. 종류는 아래와 같이 12가지 입니다.
'BuGn', 'BuPu', 'GnBu', 'OrRd', 'PuBu', 'PuBuGn', 'PuRd', 'RdPu', 'YlGn', 'YlGnBu', 'YlOrBr', 'YlOrRd'

 

반응형
반응형

 

오늘은 파이썬의 Folium 라이브러리로 지도를 그려보도록 하겠습니다.

보통의 예제들이 주피터 노트북을 이용해서 지도 결과물을 표시하도록 되어있었는데, 불행히도 제 PC에는 아직 주피터 노트북 설치를 안했네요. 그래서 한참동안 그냥 결과물을 보려고 고생을 하다가 갑자기 그녀석이 생각났습니다.

chatGPT~!!!

ㅋㅋㅋㅋ 한번 이용해봐야겠습니다.

 

첨엔 folium 결과를 matplotlib로 내보낼 수 있을까 하고 한참을 고민했는데, chatGPT도 실패를 했습니다. IPython을 깔기도 하고, 별의별 라이브러리를 다 갖다가 붙여놨는데, 결론은 이미지 파일로 만들어서 픽셀단위로 matplotlib에 뿌리더군요. 이건 좀 아니지 않나 싶어서 간단히 html로 만든 결과물을 브라우저로 자동으로 오픈시켜주는 코드로 마무리했습니다.

 

import folium as g
import webbrowser

# 기본 맵 중심점과 배율을 선언해주시고..
g_map = g.Map(location=[34.5, 128], zoom_start=7)

# 동그라미 표시할 지역 몇개만 찍어봅니다. (제주, 서울, 부산)
latlon=[
    [33.45, 126.56],
    [37.56, 126.97],
    [35.18, 129.08]
]

# 마커도 하나 추가하구요.
marker = g.Marker([37.5, 127.1],
                  popup='campus seven',
                  icon=g.Icon(color='blue'))
marker.add_to(g_map)

# 지역을 돌아가면서 흰색 원과, 파란색 원을 그려줍니다.
for i in range(len(latlon)):
    g.Circle(
        location = latlon[i],
        radius = 50,
        color = '#000000',
        fill='crimson',
    ).add_to(g_map)

for j in range(len(latlon)):
    g.CircleMarker(
        latlon[j],
        radius=70,
        color='skyblue',
        popup='campus seven',
        fill_color='skyblue'
    ).add_to(g_map)

# g_map # 주피터노트로 볼 때 쓰던 코드

# html로 저장한 후 띄워주는 부분
g_map.save('map.html')
webbrowser.open_new_tab('map.html')

 

chatGPT로 했음에도 한참 걸렸네요. 이렇게 간단히 지도를 띄우고 필요한 도형을 표시하는 법, 주피터노트 없이 띄우는 법을 알아보았습니다. 

 

그럼 이만~~~

반응형
반응형

특정 폴더의 파일 전체에 대해서 일괄 수정하는 기능을 구현해 보았습니다.

add_string 함수는 파일명에 접두사 접미사를 붙여서 출력하는 기능이고,

change_string 함수는 파일명에 특정 문자열을 다른 문자열로 바꾸는 기능입니다.

 

<주의>
우선은 파일명을 확인하는 부분까지만 구현하고, 실제 변경하는 부분은 주석 처리하였습니다. 사용하실 분은 해당 부분 주석 해제후 사용하세요.
import os

def add_string(path, prefix, suffix):
    for filename in os.listdir(path):
        name_only, ext = filename.split('.')    # 파일명과 확장자로 분리
        print(name_only, ext)
        new_name = prefix + name_only + suffix + '.' + ext  # 새 파일명 조합
        print(new_name)
        # os.rename(path+filename, path+new_name)

def change_string(path, prev, next):
    for filename in os.listdir(path):
        new_name = filename.replace(prev,next)
        print(new_name)
        # os.rename(path+filename, path+new_name)

add_string('d://test', 'test','뭐뭐뭐')
change_string('d://test','abc','abcdef')

 

<원본>

 

<add_string>

 

<change_string>

반응형
반응형

Python의 주요 사용처가 엑셀, CSV 등의 데이터를 이용한 데이터 분석인데, 매번 함수를 찾아다니기 귀찮아서 한곳에 모아놓습니다. 

df=pd.read_csv('test.csv')
df.to_csv('test.csv', index=False)
df.head()
df.tail()
df.info()
df.dtypes
df.shape
df.describe()
df['나이'].describe()
df['나이'].value_counts() # 컬럼 값 분포
df['나이'].value_counts().index # 시리즈 인덱스
df['나이'].value_counts().tolist()
df['나이'].value_counts().reset_index() # 인덱스를 하나의 칼럼으로..
df['나이'].sort_values() # 특정 컬럼 정렬
df.sort_values(by=['나이','잔고']) # 특정 컬럼 정렬2
df['나이대']=df['나이'].apply(lambda x : in_business_age_name(x)) # Apply 함수 사전 정의 필요

df.isna()
df.isnull()
df.fillna(0)
df.rename(columns={'컬럼_origin','컬럼_new'}, inplace=True)
df.T
df.loc[0:1, 'name':'addr'])
df.iloc[:2]
df.iat[2,2]
df.at[2,'컬럼1']
df.drop('컬럼4', axis=1, inplace=True) # 컬럼4가 삭제됨
df.drop(4, inplace=True) # 인덱스4가 삭제됨
df['컬럼1'].unique()

df.tolist()
df.dict()
df.groupby('나이').count()
df.corr(method='pearson')
df.cov(min_periods=None, ddof=1)

df_col = pd.concat([df1, df2]) # 아래로 합침
df_col = pd.concat([df1, df2], axis=1) #오른쪽으로 합침

table=pd.pivot_table(df, values='국어', index=['반'], columns=['전공'], aggfunc=np.mean)
반응형
반응형

Pycharm이던 Jupyter Notebook이던 Dataframe형태의 결과를 볼 때, 칼럼의 수가 많아지면 기본적으로는 중간이 ....으로 표시됩니다. 간단하게 확인만 할건데 매번 추가코드를 작성하기도 귀찮고....

 

이럴 때 옵션 하나면 간단히 처리할 수 있습니다.

# row 생략 없이 출력
pd.set_option('display.max_rows', None)
# col 생략 없이 출력
pd.set_option('display.max_columns', None)

 

누군가에겐 도움이 되었길

반응형
반응형

matplotlib의 plot기능에서 색상/라인/마커의 종류에 대해 알아보겠습니다.

 

<예시코드>

import matplotlib.pyplot as plt

plt.plot([1, 2, 3, 4], [2, 4, 6, 8], 'bo-')     # 파란색 + 마커 + 실선
plt.xlabel('X-Axis')
plt.ylabel('Y-Axis')
plt.show()

 

<컬러와 라인 스타일>

 

<마커 종류>

반응형
반응형

키보드 입력에 맞추어 비프음을 내도록 하겠습니다. 이번 프로그램을 위해서는 비프음을 내도록 하는 windsound 모듈과 키보드 인풋을 받아들이는 pynput 모듈이 필요합니다. 그 중 windwound 모듈은 기본으로 내장되어있으니 pynput 모듈만 설치해주도록 합니다.

 

1. 라이브러리 설치

pip install pynput

 

2. pynput모듈

pynput 모듈에서는 on_press 이벤트와 on_release 이벤트에 대해 리스너를 통해 입력받는 방법이 있습니다.

from pynput import keyboard

def on_press(key):
    print('Pressed Key: %s' % key)

def on_release(key):
    print('Pressed Key: %s' % key)
    if key == keyboard.Key.esc: #esc 키가 입력되면 종료
        return False
        
 # 리스너 등록방법1
listener = keyboard.Listener(
     on_press=on_press,
     on_release=on_release)
listener.start()
listener.join()

# 리스너 등록방법2
with keyboard.Listener(
    on_press=on_press,
    on_release=on_release) as listener:
    listener.join()

이런식으로 이용하면 되지만, 이번에는 동기화 방식에 의한 방법으로

from pynput import keyboard
 
with keyboard.Events() as events:
    for event in events:
        if event.key == keyboard.Key.esc:
            print("Exit!!")
            break
        if event.key == keyboard.KeyCode(char='a'):
            print("Pressed:", keyboard.KeyCode(char='a'))

와 같이 사용하려고 합니다. 이벤트의 종류와 상관없이 처리를 하게 됩니다.

 

3. winsound 모듈

winsound.Beep(음계주파수, 지속시간)

와 같이 사용합니다. 연주를 위해서는 음계에 대한 정확한 주파수를 입력해야합니다. 다행스러운 것은 한 옥타브 위의 음에 대해서는 2배의 Frequency에 해당하는 주파수를 갖고 있습니다.

 

4. 전체 소스코드

from pynput import keyboard
import winsound

# 1옥타브: C, C#, D, D#, E, F, F#, G, G#, A, A#, B
pitch = {'c_': 523, 'cs': 554, 'd_': 587, 'ds': 622, 'e_': 659,
         'f_': 698, 'fs': 740, 'g_': 784, 'gs': 831, 'a_': 880,
         'as': 932, 'b_': 988}
# 2옥타브
pitch2={}
for key, value in pitch.items():
    pitch2[key] = value * 2  # 한옥타브 위는 주파수가 2배.
print(pitch2)

# 지속시간
lasting = 100

# The event listener will be running in this block
with keyboard.Events() as events:
    for event in events:
        if event.key == keyboard.Key.esc:
            print("Exit!!")
            break
        elif event.key == keyboard.KeyCode(char='q'):
            winsound.Beep(494, lasting)
        elif event.key == keyboard.KeyCode(char='a'):
            winsound.Beep(pitch['c_'], lasting)
        elif event.key == keyboard.KeyCode(char='w'):
            winsound.Beep(pitch['cs'], lasting)
        elif event.key == keyboard.KeyCode(char='s'):
            winsound.Beep(pitch['d_'], lasting)
        elif event.key == keyboard.KeyCode(char='e'):
            winsound.Beep(pitch['ds'], lasting)
        elif (event.key == keyboard.KeyCode(char='d')) | (event.key == keyboard.KeyCode(char='r')):
            winsound.Beep(pitch['e_'], lasting)
        elif event.key == keyboard.KeyCode(char='f'):
            winsound.Beep(pitch['f_'], lasting)
        elif event.key == keyboard.KeyCode(char='t'):
            winsound.Beep(pitch['fs'], lasting)
        elif event.key == keyboard.KeyCode(char='g'):
            winsound.Beep(pitch['g_'], lasting)
        elif event.key == keyboard.KeyCode(char='y'):
            winsound.Beep(pitch['gs'], lasting)
        elif event.key == keyboard.KeyCode(char='h'):
            winsound.Beep(pitch['a_'], lasting)
        elif event.key == keyboard.KeyCode(char='u'):
            winsound.Beep(pitch['as'], lasting)
        elif (event.key == keyboard.KeyCode(char='j')) | (event.key == keyboard.KeyCode(char='i')):
            winsound.Beep(pitch['b_'], lasting)
        elif event.key == keyboard.KeyCode(char='k'):
            winsound.Beep(pitch2['c_'], lasting)
        elif event.key == keyboard.KeyCode(char='o'):
            winsound.Beep(pitch2['cs'], lasting)
        elif event.key == keyboard.KeyCode(char='l'):
            winsound.Beep(pitch2['d_'], lasting)
        elif event.key == keyboard.KeyCode(char='p'):
            winsound.Beep(pitch2['ds'], lasting)
        elif (event.key == keyboard.KeyCode(char=';')) | (event.key == keyboard.KeyCode(char='[')):
            winsound.Beep(pitch2['e_'], lasting)
        elif event.key == keyboard.KeyCode(char="'"):
            winsound.Beep(pitch2['f_'], lasting)
        elif event.key == keyboard.KeyCode(char="]"):
            winsound.Beep(pitch2['fs'], lasting)

# 빈 키(z,x,c,v... ) 에 대해 추가로 음계 할당
        elif event.key == keyboard.KeyCode(char="z"):
            winsound.Beep(pitch['c_'], lasting)
        elif event.key == keyboard.KeyCode(char="x"):
            winsound.Beep(pitch['d_'], lasting)
        elif event.key == keyboard.KeyCode(char="c"):
            winsound.Beep(pitch['e_'], lasting)
        elif event.key == keyboard.KeyCode(char="v"):
            winsound.Beep(pitch['f_'], lasting)
        elif event.key == keyboard.KeyCode(char="b"):
            winsound.Beep(pitch['g_'], lasting)
        elif event.key == keyboard.KeyCode(char="n"):
            winsound.Beep(pitch['a_'], lasting)
        elif event.key == keyboard.KeyCode(char="m"):
            winsound.Beep(pitch['b_'], lasting)
        elif event.key == keyboard.KeyCode(char=","):
            winsound.Beep(pitch2['c_'], lasting)
        elif event.key == keyboard.KeyCode(char="."):
            winsound.Beep(pitch2['d_'], lasting)
        elif event.key == keyboard.KeyCode(char="/"):
            winsound.Beep(pitch2['e_'], lasting)

 

이상으로 연주 가능한 키보드를 만들어보았습니다.

 

~~끝~~

반응형

+ Recent posts