๋™์•„๋ฆฌ,ํ•™ํšŒ/GDGoC

[AI ์Šคํ„ฐ๋””] Section 2 : ๋จธ์‹ ๋Ÿฌ๋‹์— ํ•„์š”ํ•œ ๊ธฐ๋ณธ ์ง€์‹ ์Šต๋“

egahyun 2024. 12. 26. 03:55

Python ๋ฌธ๋ฒ•

Data type : 8๊ฐœ๋กœ ๊ตฌ์„ฑ

→ ์–ด๋””๋“  ๋‹ค ์žˆ๋Š” 4๊ฐœ (์›์‹œ ๋ฐ์ดํ„ฐ ํƒ€์ž…) : float, int, string, bool

→ ํŒŒ์ด์ฌ์—๋งŒ ์žˆ๋Š” ๋…ํŠนํ•œ ํƒ€์ž… : list, tule, dictionary, set

  1. Numbers : float, int
    • ๊ธฐ๋ณธ operation : +, *, /, **, %(๋ชจ๋“ˆ๋Ÿฌ, ๋‚˜๋จธ์ง€), ()
  2. Strings
    • ‘’, “” : ๋‘๊ฐœ ์ค‘ ํ•˜๋‚˜๋กœ ๋ฌถ์–ด์ฃผ๋ฉด ๋จ ⇒ ๋ญ๋“  ๋˜‘๊ฐ™์Œ  ⇒ ๋ฌธ์žฅ ์•ˆ์— ‘’๊ฐ€ ๋“ค์–ด์žˆ์œผ๋ฉด “” ์‚ฌ์šฉ ๋“ฑ์œผ๋กœ ํ•˜๋ฉด ๋จ
    • ๋ฐ์ดํ„ฐ ์Šฌ๋ผ์ด์‹ฑ
      • a[0], a[-1](๋’ค ๋ถ€ํ„ฐ ์‹œ์ž‘)
      • a[0:4] : [ํฌํ•จ:ํฌํ•จ์•ˆ๋จ] ⇒ 0,1,2,3
    • ๊ธธ์ด : len(a)⇒ a[len(a)] (x) a[len(a)-1] (o)  ⇒ ์ธ๋ฑ์Šค๋Š” 0๋ถ€ํ„ฐ ์‹œ์ž‘, ๊ธธ์ด๋Š” ๊ฐœ์ˆ˜์ด๋ฏ€๋กœ ์ฃผ์˜
  3. Printing
    • Place holder : {}, format()⇒ ex) print(“Num is: {}, and name is: {}”.format(a,b))
    • ⇒ ex) print(“Num is: {one}, and name is: {two}”.format(one=a, two=b))
  4. Lists
    • ๊ฐ€์žฅ ์ค‘์š”ํ•œ ํŒŒ์ด์ฌ ๋ฐ์ดํ„ฐ ํƒ€์ž…
    • ๋‹ค๋ฅธ ๋žญ๊ท€์ง€์˜ Array์™€๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค๋ฆ„ : ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ํƒ€์ž…๋“ค์ด ์„ž์—ฌ์žˆ์„ ์ˆ˜ ์žˆ์Œ
    • ๋ณ€์ˆ˜์— ๋ฆฌ์ŠคํŠธ assign : a = [‘a’, 1, [1, 2]]
    • ๋ฆฌ์ŠคํŠธ์— ์ƒˆ๋กœ์šด element ์ถ”๊ฐ€ : append() ๋ฉ”์†Œ๋“œ ⇒ a.append(‘d’)
    • ์Šฌ๋ผ์ด์‹ฑ : string ์Šฌ๋ผ์ด์‹ฑ๊ณผ ๋™์ผ → ์ˆœ์„œ์— ์˜ํ•ด ์ธ๋ฑ์Šค๋กœ ๊ฐ’์„ ์ฐพ์Œ ⇒ a[2][0] = 1
  5. Dictionaries
    • Key-value ์Œ์œผ๋กœ ๋˜์–ด์žˆ์Œ, ์ค‘๊ด„ํ˜ธ๋กœ ํ‘œ์‹œ : d = {‘k’:1, ‘k2’:2, ‘k3’:3}
    • Key๋กœ ๊ฐ’์„ ๋ฐ”๋กœ ์ฐพ์•„๊ฐ€๊ฒŒ ๋˜์–ด์žˆ์Œ : d[‘k3’] = 3
  6. Booleans
    • True, False : ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•ด์•ผํ•จ
  7. Tuples
    • ๊ฐ’์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๋Š” ๋ฆฌ์ŠคํŠธ, ์†Œ๊ด„ํ˜ธ๋กœ ํ‘œ์‹œ : t = (1,2,3)
    • ⇒ ๋ฆฌ์ŠคํŠธ์™€ ์‚ฌ์šฉํ•˜๋Š” ๋ฒ•์ด ๊ฑฐ์˜ ๋น„์Šท
    • t[0] = 1
  8. Sets
    • ์ง‘ํ•ฉ์œผ๋กœ ์ˆ˜ํ•™์˜ ์ง‘ํ•ฉ๊ณผ ๊ฐ™์Œ, ์ค‘๋ณต ์ œ๊ฑฐ ์‹œ์— ๋งŽ์ด ์‚ฌ์šฉ๋จ
    • ์ค‘๊ด„ํ˜ธ๋กœ ํ‘œ์‹œ : {1,2,3,2,3,3,3,3,1} ⇒ {1,2,3}
    • (์›์†Œ๊ฐœ์ˆ˜๊ฐ€ ๋งŽ์•„๋„ ์ค‘๋ณต ์ œ๊ฑฐ๋จ)

Variable Assignment

: ๋ณ€์ˆ˜ ์ด๋ฆ„ ์„ค์ •

๋ณ€์ˆ˜ ์ด๋ฆ„ ๊ทœ์น™

  1. ์˜๋ฌธ, ์ˆซ์ž, _ ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ญ๋“  ์ƒ๊ด€์—†์Œ
  2. ์ˆซ์ž๋กœ ์‹œ์ž‘ํ•˜๋ฉด ์•ˆ๋จ

๋ณ€์ˆ˜ ์ด๋ฆ„ ๋ช…๋ช…

  • ๋ณ€์ˆ˜ ์ด๋ฆ„ ์„ ์–ธํ•˜๋Š” ๋ถ€๋ถ„์ด ์—†์Œ (๋™์  ํƒ€์ดํ•‘๋˜๊ธฐ ๋•Œ๋ฌธ) ⇒ ํƒ€์ž…, ๋ณ€์ˆ˜์˜ ๊ธฐ์–ต์žฅ์†Œ๊ฐ€ ๋‹ค์ด๋‚˜๋ฏนํ•˜๊ฒŒ ์ •ํ•ด์ง
  • ๋ณ€์ˆ˜์— ๊ฐ’ ํ• ๋‹น : a = 1
  • ๋‹ค์ค‘ ํ• ๋‹น : a, b, c = 1,2,3

Comparison Operators

: >, <, ≥, ≤, ==

Logic Operators

: and, or

If, elif, else Statements

if x<2:
	print("ok")
elif x==3:
	print("middle")
else :
	print("last")

For Loops

seq = ['a','b','c']
# ๊ธฐ๋ณธ ๋ฃจํ”„ : ํ•˜๋‚˜์”ฉ ์ธ๋ฑ์Šค์— ๋”ฐ๋ผ ์ฒ˜๋ฆฌ
for i in seq:
	print(i)

# enumerate : ์ธ๋ฑ์Šค๋ž‘ ๊ฐ™์ด ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋จ
# [(0, 'a'), (1,'b'), (2, 'c')]
for i, ei in enumerate(seq):
	print(i, ei)

While Loops

while i <5:
	print(i)
	i = i + 1

Range()

  1. For๋ฌธ ๋“ฑ์— loop๋Œ๋ฆด๋•Œ ์‚ฌ์šฉ
  2. for i in range(1, 5): print(i)
  3. ๋ฐ์ดํ„ฐ ์ƒ์„ฑ
l = list(range(5))

List comprehension

[item**2 for item in x] # ๋ชจ๋“  ์›์†Œ ์ œ๊ณฑํ•˜๋Š” ๊ฒƒ

Fuction

def test_func(x,y):
	result = x*y+1
	return result

test_func(10, 20) # 201

Lambda expression

: ์ต๋ช…ํ•จ์ˆ˜ ⇒ ๊ฐ„๋‹จํžˆ ํ•œ๋ฒˆ์“ฐ๊ณ  ๋ฒ„๋ฆด ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜

(lambda x: x*10)(10) # 100

Map and filter

Map : ๋ฆฌ์ŠคํŠธ์— ํ•จ์ˆ˜๋“ค์„ ํ•˜๋‚˜์”ฉ ๋งคํ•‘ํ•ด์„œ ์ ์šฉํ•ด์ค„๋•Œ ์‚ฌ์šฉ

ํ•„ํ„ฐ : ๋žŒ๋‹ค๊ฐ€ ๋’ค์— ์žˆ๋Š” ๋ฆฌ์ŠคํŠธ์— ์›์†Œ ํ•˜๋‚˜์”ฉ ์ ์šฉ๋˜๋Š” ํ˜•ํƒœ

list(map(times2, seq))
list(map(lambda x: x*2, seq)) # 2,4,6,8
list(filter(lambda x: x%2==0, seq)) #2,4

Methods

: class ์•ˆ์— ์„ ์–ธ๋œ ํ•จ์ˆ˜ ⇒ method์™€ ํ•จ์ˆ˜๋Š” ํŒŒ์ด์ฌ์—์„œ๋Š” ๋ฌธ๋ฒ•์ ์œผ๋กœ ์™„์ „ํžˆ ๋™์ผ


Numpy

: ํ•จ์ˆ˜๋“ค์„ ๋ถˆ๋Ÿฌ์„œ ์“ฐ๋Š” ๋ชจ๋“  ๊ฒƒ๋“ค์ด ์ „๋ถ€ numpy๋กœ ๋งŒ๋“ค์–ด์ ธ์žˆ๋‹ค

1. ์†Œ๊ฐœ

 (1) ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ๋ฐฐ์—ด(array)์„ ํšจ์œจ์ ์œผ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ฒŒ ์„ค๊ณ„

 (2) ์„ ํ˜•๋Œ€์ˆ˜, ๋งคํŠธ๋ฆญ์Šค(ํ–‰๋ ฌ) ์—ฐ์‚ฐ ๋“ฑ ํ•จ์ˆ˜ ๋‚ด์žฅ

 (3) ์†๋„๊ฐ€ ํ•„์š”ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ c, c++๋กœ ์ž‘์„ฑ : ํŒŒ์ด์ฌ์€ glue language

 

2. Numpy array

: ์ž…๋ ฅ๋ฐ์ดํ„ฐ ์‚ฌ์–‘์— ๋งž์ถ”์–ด์•ผํ•˜๋ฏ€๋กœ, ๋งŒ๋“ค์–ด์„œ sklearn์— ๋„ฃ์–ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ

  • ์ฐจ์› : scalar, 1์ฐจ์› ⇒ ๋ฒกํ„ฐ, 2์ฐจ์› ⇒ matrix, 3์ฐจ์› ⇒ tensor
  • Shape: X, (2, ). (2,2) (2,2,2)
  • dtype : ๋ฐ์ดํ„ฐํƒ€์ž…
  • ํ–‰ : axis = 0, ์—ด : axis = 1, tensor์˜ ๋†’์ด : axis=2

3. Matrix์˜ numpyํ‘œํ˜„

np.array([[8,5,3],[1,2,9]]) # 2์ฐจ์› 
np.array([[[1,2],[3,4]],[[5,6],[7,8]]]) # 3์ฐจ์›

 

4. Join : Concatenate

  • ํ–‰๋‹จ์œ„ : ๋ฐ‘์œผ๋กœ ๋ถ™์ž„
  • ์—ด๋‹จ์œ„ : ์˜†์œผ๋กœ ๋ถ™์ž„

5. Slicing

a = np.array([[1,2],[3,4]]) 
a[1:] # [[3,4],]

์ฝ”๋“œ : ์‹ค์Šต

ndarray

x= np.array([1,2,3])
x.shape # (3,)
# ๊ฐ’์ด ๊ฐ€์žฅ ํฐ ์ธ๋ฑ์Šค
np.argmax(x) # 2 : 3์˜ ์ธ๋ฑ์Šค 2 ์ถœ๋ ฅ
x.argmax() # ๋™์ผํ•œ ๋ฌธ๋ฒ• 

Indexing / slice

⇒ arr[1, :2] : shape = vector

⇒ arr[1:2, :] : shape์ด ๋ฐ”๋€Œ๋Š” ๊ฒƒ์ž„, ๋ฐ์ดํ„ฐ๋Š” ๋ฐ”๋€Œ๋Š”๊ฒŒ ์—†์Œ (matrix ํ˜•ํƒœ)

๋ฒกํ„ฐ์˜ ๋‚ด์  (= ์ ๊ณฑ)

: ๋”ฅ๋Ÿฌ๋‹ ๋‚ด๋ถ€์—์„œ ํ•ด์ฃผ๋ฏ€๋กœ ์ง์ ‘ํ•  ํ•„์š”๋Š” ๊ฑฐ์˜ ์—†์Œ

  1. ์›๋ฆฌ
    1. ๋‘ ๋ฒกํ„ฐ์˜ dimension์ด ๊ฐ™์•„์•ผํ•จ
    2. ๋‚ด์ ์€ ๊ฐ ์›์†Œ์˜ ๊ณฑ์„ ๋ชจ๋‘ ๋”ํ•œ๊ฒƒ
  2. ์ฝ”๋“œ

np.dot(a,b.T) # 28

Matrix ๊ณฑ์…ˆ (ํ–‰๋ ฌ ๊ณฑ์…ˆ, dot product)

  1. ์›๋ฆฌ
    • A ์™€ B์˜ ๊ณฑ์…ˆ์‹œ, A์˜ ์—ด ๊ฐœ์ˆ˜ == B์˜ ํ–‰ ๊ฐœ์ˆ˜ ์—ฌ์•ผํ•จ
    • ๊ฒฐ๊ณผ ํ–‰๋ ฌ์˜ shape : A์˜ ํ–‰ x B์˜ ์—ด2
  2. ์ฝ”๋“œ
np.matmul(a,b)

์ „์น˜ ํ–‰๋ ฌ

: ํ–‰, ์—ด์ด ์„œ๋กœ ๋ฐ”๋€Œ๋Š”๊ฒƒ ⇒ ์ž…๋ ฅ ์‚ฌ์–‘๋“ค์„ ๋งž์ถ”๋Š”๋ฐ ๋งŽ์ด ์‚ฌ์šฉ๋จ

  1. ์ฝ”๋“œ
# ์…‹ ๋‹ค ๋˜‘๊ฐ™์€ ๊ฐ’
a.T
np.transpose(a)
a.transpose()

*์›ํ•˜๋Š” shape๋กœ ๋ฐ”๊พธ๊ณ  ์‹ถ๋‹ค๋ฉด

a.reshape(3,3)  # 3,3 ์œผ๋กœ ๋ฐ”๋€œ

 


Pandas

: series data type + dataframe data type๋กœ ๊ตฌ์„ฑ๋จ

์†Œ๊ฐœ

1. Series (1์ฐจ์›) : numpy array์™€ ์œ ์‚ฌ

  (1) ์ฐจ์ด์ 

    - Series : axis์— label ๋ถ€์—ฌ ๊ฐ€๋Šฅ → label ๋ช…์œผ๋กœ ์ธ๋ฑ์‹ฑ ๊ฐ€๋Šฅ

                    ์ˆซ์ž ์ด์™ธ์˜ ๋‹ค๋ฅธ ๊ฒƒ๋“ค๋„ ์›์†Œ๋กœ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Œ

    - numpy : ์ˆซ์ž๋งŒ ์žˆ์–ด ๋ ˆ์ด๋ธ” ๋ถ€์—ฌ ๋ถˆ๊ฐ€๋Šฅ → ์ธ๋ฑ์Šค๋งŒ์œผ๋กœ ์ธ๋ฑ์‹ฑ 

                    ์ˆซ์ž๋งŒ ์›์†Œ๋กœ ๊ฐ€์ง

 

2. Dataframe (2์ฐจ์›, table) : ์—ฌ๋Ÿฌ๊ฐœ์˜ series๋ฅผ ๊ฐ™์€ index๊ธฐ์ค€์œผ๋กœ ๋ชจ์•„ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“  ๊ฒƒ

 → series ๋‹จ์œ„๋กœ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ

(1) ๊ตฌํ˜„

# ๋ฐ์ดํ„ฐ ์ƒ์„ฑ -> ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„์œผ๋กœ ๋ณ€ํ™˜
data = np.random.randn(5,4) # ๋žœ๋ค์œผ๋กœ 5,4 ํ–‰๋ ฌ ์ƒ์„ฑ
df = pd.Dataframe(data) # column ์ด๋ฆ„์€ ์ž„์˜๋กœ 0 1 2 3...

# ๋ฐ์ดํ„ฐ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
df = pd.read_csv("ํŒŒ์ผ๋ช….csv") # ์ฝค๋งˆ๋กœ ๋ถ„๋ฅ˜๋œ ๊ฒฝ์šฐ๊ฐ€ default
df = pd.read_csv("ํŒŒ์ผ๋ช….csv", sep=',') 

# ์ปฌ๋Ÿผ ์ด๋ฆ„ ์ง€์ •
df = pd.DataFrame(data, columns=['W','X','Y','Z'])

# df์˜ ์ •๋ณด ํ™•์ธ
df.head(5) # 5๊ฐœ์˜ ํ–‰์„ ๋ณผ ์ˆ˜ ์žˆ์Œ
df.columns # ์—ด ์ด๋ฆ„ ์ถœ๋ ฅ
df.info() # df์˜ ์ •๋ณด ์ถœ๋ ฅ : entry, column, non-null ๊ฐœ์ˆ˜ ๋“ฑ
df.describe() # ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์˜ ๊ธฐ์ˆ  ํ†ต๊ณ„ ์ถœ๋ ฅ : count, mean ๋“ฑ

 

(2) ์ธ๋ฑ์‹ฑ

df['W'] # ์—ด๋ณ„๋กœ ์ธ๋ฑ์‹ฑ -> series ์ถœ๋ ฅ
df[['W', 'X', 'Y']] # dataframe์ด ์ถœ๋ ฅ

(3) ์นผ๋Ÿผ ์ถ”๊ฐ€ / ์‚ญ์ œ

df['new'] = df['X'] + df['Y'] # df์— new๋ผ๋Š” ์นผ๋Ÿผ ์ƒ์„ฑ : x, y ์—ด ๋”ํ•œ๊ฒƒ
df.drop('new') # ์—๋Ÿฌ ๋ฐœ์ƒ : ๊ธฐ๋ณธ์ด axis = 0์ด๋ฏ€๋กœ ์˜ค๋ฅ˜
df.drop('new', axis=1) # ๋ฉ”๋ชจ๋ฆฌ์ƒ ๋ฐ”๋€๊ฑฐ๊ณ  ์›๋ณธ์€ ์•ˆ๋ฐ”๋€œ
# ์›๋ณธ๋„ ์—…๋ฐ์ดํŠธ ํ•˜๋ ค๋ฉด ์•„๋ž˜์˜ ๋‘ ๋ฐฉ๋ฒ• ์‚ฌ์šฉ
df.drop('new', axis=1, inplace=True)
df = df.drop('new', axis=1)

(4) ๊ฒฐ์ธก์น˜ ์ฒ˜๋ฆฌ

→ ์™„์ „ํžˆ ์‚ญ์ œ : dropna() / ์ž„์˜์˜ ๊ฐ’์œผ๋กœ ๋Œ€์ฒด : fillna()

# ๊ฒฐ์ธก์น˜ ํฌํ•จ๋œ ๋ชจ๋“  ํ–‰ ์‚ญ์ œ
df.dropna()
# ๊ฒฐ์ธก์น˜ ํฌํ•จ๋œ ๋ชจ๋“  ์—ด ์‚ญ์ œ
df.dropna(axis=1)
# ์ž„์˜์˜๊ฐ’์œผ๋กœ ๋Œ€์ฒด
df.fillna(0) # 0์œผ๋กœ ์ฑ„์›Œ์ง
df.fillna(value=0)
df.fillna(df['X'].mean()) # X์—ด์˜ ํ‰๊ท ๊ฐ’์œผ๋กœ ์ฑ„์›€(nan์€ ์ œ์™ธ๋˜๊ณ  ํ‰๊ท  ๊ณ„์‚ฐ)

 


Matplotlib

์‚ฌ์šฉ ๋ฐฉ๋ฒ• : 2๊ฐ€์ง€ ์Šคํƒ€์ผ

1. Functional programming style

import matplotlib.pyplot as plt
plt.plot(x,y)

 

2.OOP style

flg, ax = plt.subplots() 
ax.plot(x,y)

ํ‘œํ˜„

Pyplot object ๊ตฌ์„ฑ

๊ธฐ๋ณธ ์„ , ์ 

plt.plot(3,2,'o',c=r) # ์  ์ฐ๊ธฐ : x๊ฐ’, y๊ฐ’, ๋ชจ์–‘, ์ƒ‰
plt.plot([1,2,3],[4,5,1]) # ์„ ๊ธ‹๊ธฐ : x๊ฐ’๋“ค, y๊ฐ’๋“ค 

๊ทธ๋ž˜ํ”„ ๋‘ ๊ฐœ ๊ทธ๋ฆฌ๊ธฐ

plt.title("์ œ๋ชฉ") # ์ œ๋ชฉ
plt.xlabel("x์ถ• ์ด๋ฆ„")
plt.ylabel("y์ถ• ์ด๋ฆ„")

Bar chart

plt.bar(x,y,label="์ด๋ฆ„1") # ์ด๊ฒƒ๋งŒ ์“ฐ๋ฉด ๋ง‰๋Œ€ 1๊ฐœ, ์•„๋ž˜๋„ ํ•˜๋ฉด 2๊ฐœ
plt.bar(x2,y2,label="์ด๋ฆ„2")
plt.legend() # ๋ ˆ์ด๋ธ” ๋ฒ”๋ก€ ๊ทธ๋ฆฌ๊ธฐ

Scatter plot : ์‚ฐ์ ๋„

plt.scatter(x,y,label="์ด๋ฆ„1") # ์ด๊ฒƒ๋งŒ ์“ฐ๋ฉด ์ข…๋ฅ˜ 1๊ฐœ, ์•„๋ž˜๋„ ํ•˜๋ฉด ์ข…๋ฅ˜ 2๊ฐœ
plt.scatter(x2,y2,label="์ด๋ฆ„2")
plt.legend()

Histogram

plt.hist(x) # array ๊ฐ’๋“ค์ด ํžˆ์Šคํ† ๊ทธ๋žจ์œผ๋กœ ํ‘œํ˜„๋จ
# ์œ„์— ์ •๋ณด๋“ค ์—†์• ๊ณ  ํžˆ์Šคํ† ๊ทธ๋žจ ๊ทธ๋ž˜ํ”„๋งŒ ๋ณด์ด๊ฒŒ ํ•˜๋Š” ์„ธ๊ฐ€์ง€ ๋ฐฉ๋ฒ•
plt.show()
None
plt.hist(x);
# ๋ ˆ์ด๋ธ”๋ช… ์ง€์ •
plt.xlabel("random number")
plt.ylabel("frequency")
# ๊ฐ„๊ฒฉ
plt.hist(x, bins=10)

OOP style

# ๊ทธ๋ฆผํŒ ์„ ์–ธ, ๋„ํ™”์ง€ 2๊ฐœ = row ๊ฐœ์ˆ˜, ์—ด ๊ฐœ์ˆ˜, ๊ทธ๋ฆผ ์‚ฌ์ด์ฆˆ
fig, (ax1, ax2) = plt.subplots(1,2,figsize=(8,4))
# ์ฒซ๋ฒˆ์งธ ๊ทธ๋ž˜ํ”„ : ์™ผ์ชฝ
ax1.scatter(x,y,c='r',marker='o', edgecolor='k')
ax1.set_title("์ฒซ๋ฒˆ์งธ ๊ทธ๋ž˜ํ”„ ์ œ๋ชฉ")
ax1.set_xlabel("์ฒซ๋ฒˆ์งธ ๊ทธ๋ž˜ํ”„ x์ถ• ์ด๋ฆ„")
ax1.set_ylabel("์ฒซ๋ฒˆ์งธ ๊ทธ๋ž˜ํ”„ y์ถ• ์ด๋ฆ„")
# ๋‘๋ฒˆ์งธ ๊ทธ๋ž˜ํ”„ : ์˜ค๋ฅธ์ชฝ
ax2.hist(data, bins=20)
ax2.set_title("๋‘๋ฒˆ์งธ ๊ทธ๋ž˜ํ”„ ์ œ๋ชฉ")
ax2.set_xlabel("๋‘๋ฒˆ์งธ ๊ทธ๋ž˜ํ”„ x์ถ• ์ด๋ฆ„")
ax2.set_ylabel("๋‘๋ฒˆ์งธ ๊ทธ๋ž˜ํ”„ y์ถ• ์ด๋ฆ„")

์ด๋ฏธ์ง€ : imshow

→ image data ์ฒ˜๋Ÿผ ํ–‰๋ ฌ ํ˜•ํƒœ์˜ 2์ฐจ์› ๋ฐ์ดํ„ฐ๋Š” imshow๋กœ ํ‘œ์‹œ

from sklearn.datasets import load_digits
x = load_digits()
img = x['images']
img = x['images'][0] # ํ•œ์žฅ๋งŒ ๊ทธ๋ ค๋ณด๊ธฐ ์œ„ํ•จ
plt.imshow(img, cmap='gray') # ํ‘๋ฐฑ์œผ๋กœ ๊ทธ๋ ค์ง
plt.xticks([]) # ์˜†์— ์ˆซ์ž ์‚ญ์ œ
plt.yticks([])

Feature scaling

: raw data๋ฅผ ์ „์ฒ˜๋ฆฌํ•˜์—ฌ input data์˜ ๊ตฌ๊ฐ„์„ ํ‘œ์ค€ํ™” (ํฌ๊ธฐ๊ฐ€ ๋น„์Šทํ•˜๊ฒŒ !)

→ ํฌ๊ธฐ๊ฐ€ ํ†ต์ผ๋˜์ง€ ์•Š๊ณ  ์ „๋ถ€ ์ œ์•ฝ์ด ๋‹ค๋ฅธ ๊ฒฝ์šฐ, ๋จธ์‹ ๋Ÿฌ๋‹์˜ ์ž…๋ ฅ์„ ์ฃผ๊ธฐ ์ „์— ์‚ฌ์ด์ฆˆ๋ฅผ ์ „๋ถ€ ๋งž์ถ”๋Š” ์ž‘์—…์ด ํ•„์š”

⇒ ๋น„์Šทํ•œ ํฌ๊ธฐ๋กœ ๋ฐ”๊พธ๊ธฐ : ๋น„์Šทํ•œ ์†Œ์ˆ˜์  ๋‹จ์œ„ ๋“ฑ

→ ํŠน์ • ํ”ผ์ฒ˜์˜ value๊ฐ€ ๋‹ค๋ฅธ ํ”ผ์ฒ˜๋“ค ๋ณด๋‹ค ํ›จ์”ฌ ํฌ๋ฉด ๊ทธ ๊ฐ’์ด ๋ชฉ์ ํ•จ์ˆ˜๋ฅผ ์ง€๋ฐฐํ•˜๋ฏ€๋กœ ์ •ํ™œํ•œ ํ•™์Šต์ด ๋ถˆ๊ฐ€ํ•จ

์ข…๋ฅ˜

1. Simple Scaling

: ์–ด๋–ค ํ”ผ์ฒ˜์˜ ์ตœ๋Œ€๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์ผ๊ด„์ ์œผ๋กœ ๋‚˜๋ˆ ์คŒ

→ ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ์—์„œ ๋งŽ์ด ์‚ฌ์šฉ : 255๋กœ ๋‚˜๋ˆ„๋ฉด ์ž๋™์ ์œผ๋กœ ์ž˜ ๋˜๊ธฐ ๋•Œ๋ฌธ

$$x_{new}= \frac{x_{old}}{X_{max}}$$

 

2. Standard Scaling (Z-score)

: ํ‰๊ท ๊ณผ ํ‘œ์ค€ํŽธ์ฐจ๋ฅผ ์ด์šฉํ•ด ์Šค์ผ€์ผ๋ง

→ ํ‰๊ท ์„ 0์œผ๋กœ ํ•˜๊ณ  0์ฃผ๋ณ€์— ๋ถ„์‚ฐ๋œ ์ข…๋ชจ์–‘ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜

$$ z = (x-\mu)/s $$

3. Min-max Scaling

: ์–ด๋–ค ๋ฐ์ดํ„ฐ๊ฐ’์—์„œ ์ตœ์†Œ๊ฐ’์„ ๋นผ๊ณ , ๋ฐ์ดํ„ฐ์˜ ๊ตฌ๊ฐ„์œผ๋กœ ๋‚˜๋ˆˆ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜

→ ์ตœ์†Œ๊ฐ’ = 0 ~ ์ตœ๋Œ€๊ฐ’ = 1 ์‚ฌ์ด์˜ ๊ฐ’๋“ค๋กœ ์Šค์ผ€์ผ๋ง ๋จ

→ x=min ⇒ 0, max ⇒ 1

$$ x_{new} = \frac{x_i-min(x)}{max(x)-min(x)} $$

from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import StandardScaler

# ์‹ฌํ”Œ ์Šค์ผ€์ผ๋ง
X_simple = X / X.max()

# min max
x_minmax = (x-x.min())/(x.max()-x.min())
sc = MinMaxScaler()
X_minmax2 = sc.fit_transform(X)
# fit : ์ตœ๋Œ€๊ฐ’, ์ตœ์†Œ๊ฐ’์„ ๋ฏธ๋ฆฌ ๊ทธํ•ด๋†“๋Š”๊ฒƒ
# transform : ๊ตฌํ˜„ํ•œ ์ตœ๋Œ€ ์ตœ์†Œ๋ฅผ ์ด์šฉํ•ด ๊ณต์‹์— ์ ์šฉํ•˜๋Š” ๊ฒƒ

#Standard scaling
X_standard = (X - X.mean())/X.std()
sc = StandardScaler()
X_standard2 = sc.fit_transform(X)

์‹œ๊ฐํ™”

plt.figure(figsize=(14,4))
plt.subplot(1,4,1)
plt.hist(X, bins =50)
plt.title("original data")

plt.subplot(1,4,2)
plt.hist(X_simple, bins =50)
plt.title("simple data")

plt.subplot(1,4,3)
plt.hist(X_minmax, bins =50)
plt.title("minmax data")

plt.subplot(1,4,4)
plt.hist(X_standard, bins =50)
plt.title("standard data")
# ๋ถ„ํฌ๋Š” ๋ฐ”๋€Œ์ง€ ์•Š์œผ๋‚˜ ๋ฒ”์œ„๋งŒ ๋ฐ”๋€œ