출처: https://astrocosmos.tistory.com/202 [ASTROCOSMOS:티스토리] 하나둘셋넷 :: 하나둘셋넷
728x90

내용

  • PCA
  • PCA 코드
  • 주성분 누적 분산 그래프 elbow method
PCA 사용하기
* 선언

- 생성할 주성분의 개수 지정
- 원래 feature의 수만큼 지정할 수 있음
( 일반적으로 feature 수 만큼 지정 )
- 생성 후 조정할 수 있음
* 적용
- x_train으로 fit & transform
- 다른 데이터는 적용
- 결과는 numpy array
* 코드
# 라이브러리
from sklearn.decomposition import PCA

# 주성분 분석 선언
pca = PCA(n_components=n)

# 만들고, 적용
x_train_pc = pca.fit_transform(x_train)
x_val_pc = pca.transform(x_val)

 

코드
1. 데이터 준비

(1) 라이브러리 로딩

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

from sklean.model_selection import train_test_split


(2) 스케일링
scaler = MinMaxScaler()
x = scaler.fit_transform(x)

(3) 데이터 분할
x_train, x_val, y_train, y_val = train_test_split(x, y, test_size = .3, random = 20)


2. 차원 축소 : 주성분 PCA

(1) 주성분 만들기
from sklearn.decomposition import PCA

(2) 주성분 분석 수행
# 주성분을 몇 개로 할지 결정( 최대값 : 전체 feature 수)
n = x_train.shape[1]

# 주성분 분석 선언
pca = PCA(n_components = n)

# 만들고 적용
x_train_pc = pca.fit_transform(x_train)
x_val_pc = pca.transform(x_val)

(3) 결과는 numpy array로 주어지므로 데이터 프레임으로 변환

# 컬럼 이름 생성
column_names = ['PC' + str(i+1) for i in range(n) ]

# 데이터프레임으로 변환
x_train_pc = pd.DataFrame(x_train_pc, columns = column_names )
x_val_pc = pd.DataFrame(x_val_pc, columns = column_names
연습

# 주성분 1개짜리
pca1 = PCA(n_components = 1)
x_pc1 = pca1.fit_transform(x_train)

# 주성분 2개짜리
pca2 = PCA(n_components = 2)
x_pc2 = pca2.fit_transform(x_train)

# 주성분 3개짜리
pca3 = PCA(n_components = 3)
x_pc3 = pca3.fit_transform(x_train)
주성분 누적 분산 그래프

- 그래프를 보고 적절한 주성분의 개수를 지정(elbow method)
- x축 : PC 수
- y축 : 전체 분산크기 - 누적분산크기

# 코드
plt.plot( range(1, n+1), pca.explained_variance_ratio_, marker = '.')
plt.xlabel('No. of PC')

728x90
728x90

군집분석

1. 라이브러리 로딩
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

# 클러스터링을 위한 함수
from sklearn.cluster import KMeans

# 데이터 만들기
from sklearn.datasets import make_blobs
x, y = make_blobs(n_samples = 300, center=4, cluster_std=0.60, random_state = 0)
x = pd.DataFrame(x, columns = ['x1', 'x2'])
y = pd.Series(y, name = 'shape')

2. k-means
(1) k means 모델 만들기

1) 군집모델 생성
# k means 학습
model = KMeans(n_cluster=2, n_init='auto' )
model.fit(x)

# 예측
pred = model.predict(x)

# feature + pred + y 붙여서 비교
pred = pd.DataFrame(pred, columns = ['predicted'])
result = pd.concat( [ x, pred, y ], axis = 1)

시각화

# 코드
plt.scatter(result['x1'], result['x2'], c=result['predicted'], alpha =0.5)
plt.scatter(centers['x1'], centers['x2'], s = 50, marker ='D', c='r'

 

적정한 k 값 찾기

# k means 모델을 생성하게 되면 inertia 값을 확인 가능

model.inertia_
from sklearn.cluster import KMeans

kvalues = range(1, 10)
inertia = []

for k in kvalues:
    model = KMeans(n_clusters = k, n_init = 'auto')
    model.fit(x)
    inertias.append(model.inertia_)

# 그래프 그리기
plt.plot(kvalues, inertias, '-o')
plt.xlabel('numbers of clusters, k')
plt.ylabel('inertia')

# 적정한 k 값을 찾은 경우

 

분석 방법

 

 

728x90

'데이터 - 머신러닝 비지도 학습' 카테고리의 다른 글

비지도 학습] "k-means 미프 실습"  (0) 2023.09.26
비지도 학습] PCA  (0) 2023.09.20
728x90

지도 학습 분류 문제

랜덤 포레스트 분류

  1. 환경 준비
  2. 데이터 준비
  3. 모델링
1. 환경준비
# 라이브러리 불러오기

from  sklearn.ensemble import RandomForestClassifier

2. 데이터 준비
data = pd.read_csv('데이터.csv')

target = 'medv'

# 데이터 분리
x = data.drop(target, axis=1)
y = data.loc[:,target]


# 학습용, 평가용 데이터 분리
from sklearn.model_selection import train_test_split

x_train, x_test, y_train, y_test = train_test_split(x,y, test_size = 0.3, random_state = 2023)
4. 모델링
#  선언하기

model = RandomForestClassifier(max_depth=5, random_state=1)

#  학습하기

model.fit(x_train_s, y_train)

# 예측하기

y_pred = model.predict(x_test)

# 평가하기

print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))

모델 학습 시, 출력되는 결과

 

평가물 출력 모습

728x90
728x90

지도 학습 분류 문제

결정나무 분류

  1. 환경 준비
  2. 데이터 이해
  3. 데이터 준비
  4. 모델링
  5. 기타
  • graphviz
  • 변수 중요도
1. 환경준비
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings

warnings.filterwarnings(action='ignore')
%config InlineBackend.figure_format = 'retina'

# 데이터 읽어오기
data = pd.read_csv(path)
 
2. 데이터 이해
data.head()
data.describe()
data['컬럼명'].value_counts()
data.corr()
 
3. 데이터 준비
1) x, y 분리
target = '타겟 컬럼'

x = data.drop(target, axis = 1)
y = data.loc[:, target]

2) 학습용, 평가용 데이터 분리
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.3, random_state=1)
 
4. 모델링
# 1단계
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import confusion_matrix, classification_report

# 2단계 선언하기
model = DecisionTreeClassifier(max_depth=5, random_state=1

# 3단계 학습하기
model.fit(x_train, y_train)

# 4단계 예측하기
y_pred = model.predict(x_test)

# 5단계 평가하기
print( confusion_matrix(y_test, y_pred) )
print( classification_report(y_test, y_pred) )
 
graphviz
# 시각화 모듈
from sklearn.tree import export_graphviz
from IPython.display import Image

# 이미지 파일
export_graphviz( model,
                            out_file = 'tree.dot',
                            feature_names = x.columns,
                            class_names = ['No', 'Yes'],
                            rounded = True,
                            precision = 2,
                            filled = True)
# 파일 변환
!dot tree.dot -Tpng -otree.png -Gdpi=300

# 이미지 파일 표시
Images(filename = 'tree.png')
 
변수 중요도 시각화
plt.figure(figsize=(5,5))
plt.barh(list(x), model.feature_importances_ )
plt.show()

 

728x90
728x90

KT Aivle School 에이블스쿨 기자단] 9.18(월) ~ 9.24(일) 미니 프로젝트 3차

이번주 스케줄

  • 월~화 비지도 학습
  • 화 공모전 회의, 해커톤 제출
  • 수목금 미니프로젝트
  • 금 회식
  • 일 공모전 회의 데이터 88만
  • 일 프로그래머스
  • 기차표 예매 완료 9.21(목) ~ 9.22(금)
  • 처음 이용하는 광주 지하철
  • KTX 안에서 SQLD 공부

 

이번 주 금요일 회식 - 전남대

나는 현재 타지에서 수업을 듣느라 팀원들을 대면으로 보는 거는 이번이 처음이다

노트북을 받을 때 갔던 건물에서 다시 간다는 것 또한 설레는 부분

다만, 아쉬운 거는 이번에 생각보다 회식 참여 인원이 적다는 것이다ㅠ 아쉽긴 하지만 그래도 온 에이블러들과는 즐거운 시간을 보내야지

처음 이용해보는 광주 지하철
회식 장소

KTX 타고 광주 KT로 가는 길
평소 자격증 공부 시간이 없어서 이때라도 시간을 내서 SQLD를 공부했다..
의외로 책상에서 보다 집중이 잘 되는 느낌??

KTX 타고 가는 길에 SQLD 짬짬이 공

 

첫 대면 프로젝트

처음 방문한 교육장

 나는 대면으로 에이블러들을 보는 게 처음이지만 화면으로 거의 매일 봐서 그런지 내적 친밀감은 느꼈다.

 매니저님이나 다른 에이블러들이 반갑게 맞이 해주어서 하루를 기분 좋게 시작!!

 

수업내용

블로그에 간략하게 정리해보았다

성능평가 데이터 해석

 

비지도 학습 K-Means
elbow method로 그래프에서 적절한 k값 : 팔꿈치 부분 찾기

 

 

728x90
728x90

KT Aivle School 에이블스쿨 기자단] 9.11(월) ~ 9.17(일) 해커톤 회의, 코딩 마스터즈 마감, 그 와중에 예비군 작성

이번 주의 스케줄

  • 월~금 KT 에이블스쿨 머신러닝 수업
  • 금요일 코딩마스터즈 마감
  • 토요일 예비군(인천 서구동구 예비군 훈련장)
  • 일요일 5시 해커톤 회의
  • 일요일 8시 프로그래머스 스터디(내가 주관!)
  • 일요일 책 하나 읽을 예정이었으나 예비군, 해커톤, 프로그래머스 스터디 3연타로 포기....
  • 이장래 강사님 마지막 수업
  • 회귀와 분류
  • 공모전 빅콘 --> DBI 2023
  • 코멘토

 

코딩 마스터즈 최종 성적

아직 난 하찮은 실력임을 다시 확인할 수 있었다

 
이번 주는 공모전 준비와 토요일 예비군으로 바빴지만 에이블러라면 이거를 핑계로 삼지는 말자!

이장래 강사님과의 마지막 수업ㅠ

파이썬 기초 문법으로 뵈었던게 얼마 안된 거 같은데
머신러닝 지도학습 수업을 마지막으로 이제 에이블스쿨 교육에서는 뵐 일이 없어졌다ㅠ
나는 인프런 강의에서 또 뵙겠지만 아쉬운건 어쩔 수 없는 거 같다

해커톤 일요일 회의

이번 해커톤 회의에서 개인적으로 기뻤던 부분은 내 아이디어가 매우 긍정적인 평가를 받았던 것이다

나의 해커톤 아이디어


난이도 문제로 살짝의 수정이 필요하지만 develop하는 과정 또한 흥미로울 거라 생각한다

DX 참여자로서 기획, 데이터 부분에서 밥값을 해야한다고 느끼고 있는데 일단 첫 단추는 잘 끼운 듯

아이디어에 대한 자세한 설명은 해커톤이 어느 정도 진행되면 첨부할게요~

 

공모전 변경

처음 함께 서울 공공 데이터 활용 공모전에 나갔던 에이블러들과 새로운 공모전을 탐색 중이다.
나는 다시 조장 역할을 수행 예정이다

기존에 생각했던 빅콘테스트


처음에는 이 공모전을 선정했으나 시간 관리 문제로 서류 작성 시간이 모자라져서 아래 공모전으로 변경했다

최종 결정한 DBI2023 공모전

도메인 지식을 늘리는 데 도움이 될 거 같긴 하지만 아래의 데이터들이 내가 분석해야 할 데이터 목록들... 나 할 수 있겠지...??
10,000개의 기업들을 분석해야 한다. 결측치들은 또 어떻게 처리해야 될라나

공모전 제공 데이터 총 10,000개의 기업 분석

 

내용정리

# 선언하기

model = LogisticRegression()

 

# 학습하기

model.fit(x_train, y_train)

 

 

# 평가하기

print(confusion_maxtrix(y_test, y_pred))

print(classification_report(y_test, y_pred))

학습 완료 시, 출력 결과
평가 실행 시, 출력 결과

# KNN에서 스케일링을 수행하는 이유 검색

언제나 고마운 GPT

# 수업 필기

수업시간 필기

이번주 프로그래머스

이번 프로그래머스 스터디를 진행하며 당황스러웠던 점은 하는 중간에 프로그래머스 팀즈 채널이 삭제된 것이었다!

팀원들에게 자유롭게 팀즈 공간을 꾸밀 수 있도록 모두 소유자 권한을 주었는데 아마 한 분이 실수한거 아닐까 싶다

이번 사태 이후로는 소유자 권한은 현재 리더를 맡고 있은 나만 가질 계획

 

문제풀이

프로그래머스 문제 풀이 중 알쏭달쏭했던 점 겹치는 선분의 길이

 

 

바쁜 스케줄로 읽지도 못하고 반납한 책...ㅠ

 

728x90
728x90

기타 함수

IFNULL()

- 지정한 값이 NULL이면,
 지정한 다른 값으로 바꾼 결과 반환
SELECT IFNULL(NULL, 10);

>> 10
   
NULL()

- 두 값이 같으면 NULL 반환
SELECT NULLIF(10, 10);

>> NULL
   
COALESCE()

- 나열된 값 중에서 NULL이 아닌 첫 번째 값 반환
SELECT COALESCE(NULL, NULL, 10, 20)

>> 10
   
IF()

- 조건의 참/거짓에 따른 값 반환
SELECT IF(10>1, '참', '거짓');

>> 참
728x90
728x90

숫자 관련 함수

DATE_FORMAT(DATE_OF_BIRTH, "%Y-%m-%d")

 

FORMAT()

 

- 천 단위 콤마를 갖는 문자열 반환

SELECT FORMAT(112345.7890,2);


>> 2는 소수점 2자리까지를 의미

 

CEILING()

- 지정한 수보다 큰 가장 작은 정수 반환

SELECT CEILING(15.4);

 

ROUND()

- 지정한 위치에서 반올림한 수 반환

SELECT ROUND(15.649);

 

 

SELECT ROUND(15.649, 2);

 

TRUCATE()

- 지정한 위치의 수만 반환

SELECT TRUNCATE(1234.567, 2);

 

SELECT TRUNCATE(1234.567,1);

 

SELECT TRUNCATE(1234.567, 0);

 

SELECT TRUNCATE(1234.567, -1);

ABS()

- 절대값 반환
SELECT ABS(-30);
   
FLOOR()

- 지정한 수보다 작은 가장 큰 정수 반환
SELECT FLOOR(15.7);

>> 15
   
MOD()

- 나머지를 반환
SELECT MOD(5, 2);

>> 1
   
POW()

- 제곱한 수 반환
SELECT POW(4,3)

>> 64
   
SQRT()

- 제곱근 반환
SELECT SQRT(4);

>> 2
   
GREATEST()

- 나열된 값 중에서 가장 큰 값 반환
SELECT GREATEST( 10, 12, 11, 34, 21);

>> 34
   
LEAST()


- 위와 반대 개념
 

 

728x90
728x90

SQL 이론 날짜와 시간 관련 함수

 

ADDTIME()

: 지정한 시간 만큼 더해진 날짜와 시간 반환

SELECT ADDTIME('2022-12-25 09:00:00', '35:30:40');

>> 2022-12-26 20:30:40

 

SUBTIME()

: 지정한 시간 만큼 날짜와 시간 반환

 

ADDDATE()

: 지정한 수 만큼 날이 더해진 날짜와 시간 반환

SELECT ADDDATE('2022-12-25 09:00:00', INTERVAL 15 DAY);

>> 2022-01:09 09:00:00

 

SUBDATE()

: 문법은 위와 동일

 

CURDATE()

: 현재 날짜 반환

SELECT CURDATE();

>> 현재 날짜 YYYY-MM-DD

 

CURTIME()

: 현재 시간 반환

SELECT CURTIME()

>> 현재 시간 HH:MM:SS

 

NOW()

: 현재 날짜와 시간 반환

SELECT NOW();

>> YYYY-MM-DD HH:MM:SS

 

SYSDATE()

: 위와 동일

 

QUARTER()

: 지정한 날짜의 분기 반환

SELECT QUARTER(NOW());

 

>> 3

 

월, 일, 시간

SELECT MONTH(NOW());

SELECT DAY(NOW());

SELECT TIME(NOW());

 

DATEDIFF()

: 두 날짜와 시간의 일수 차이 반환

SELECT DATEDIFF('2023-12-25 00:00:00', 'NOW()');

>> 165

 

DAYOFWEEK()

: 지정한 날짜의 요일 반환

SELECT DAYOFWEEK(NOW());

>> (일요일:1 ~ 토요일 :7)

 

DATE_FORMAT()

: 날짜를 지정한 형태의 문자열로 반환

SELECT DATE_FORMAT(NOW(), '%Y-%m-%d')


>> YYYY-MM-DD

SELECTDATE_FORMAT(NOW(), '%Y년%m월%d일')

 

 

728x90

+ Recent posts