본문 바로가기

카테고리 없음

Machine Learning - 비지도학습

728x90
반응형
1. 패턴 : Association Rule

2. 군집 : Classifiacation 

3. 그래프 : graph  

4. 추천 : recommendation

 

  •  Machine Learning 모형 구분 
    • 지도학습
    • 비지도학습 (Unsupervised Learning) 
      • target x 
        • 1. Association Rule 
          • 기저기와 맥주 ? 
            • 다수의 거래 내역 각각에 포함된 품목(ITEM)의 관찰을 통해 규칙 발견 
            • 인과관계가 있을 수 있지만 해석은 그렇게 하면 안됨 
            • 모든 데이터를 Categorical 가정 ( Numeric data에는 적절하지 않음 ) 
            • 장바구니 분석에 처음 사용됨 
              • 예 : Bread > Milk
          • Lift (향상도) , support, confidence 
            • 향상도
              • 의미 : A를 고려한 b의 구매확률을 A를 고려하지 않은 B의 구매확률로 나눈 것으로, 이 값이 높다면 우연에 의해 연관성이 나타남 
              • 두 값이 독립인 경우에는 분모 분자가 동이라고 LIFT 향상도 = 1 , 독립이 아닌 경우(연관된 경우)에는 분모, 분자 값이 다르게됨 
                • LIFT = P(B|A) / P(B) = P(A교집합B) / (P(A)*P(B))
              • 실제 분석시
                • 지지도로 일정 구매비율 이상의 항목을 찾기 
                • 대신 실제로 연관성이 크지만 구매비율이 낮은 규칙은 신뢰도로 찾기
                • Lift가 1 이상인 규칙을 찾기

 

#-----------------------------------------------------#
# Association Rule
#-----------------------------------------------------#
#Anaconda prompt에서 
#pip install mlxtend
#pip install D:/mlxtend-0.11.0-py2.py3-none-any.whl

#-----------------------------------------------------#
import mlxtend
from mlxtend.frequent_patterns import apriori # 구식인 방법 
from mlxtend.frequent_patterns import association_rules


#1. 리스트 형태로 표현된 Transaction 처리
dataset = [['Milk', 'Cookie', 'Apple', 'Beans', 'Eggs', 'Yogurt'],
           ['Coke', 'Cookie', 'Apple', 'Beans', 'Eggs', 'Yogurt'],
           ['Milk', 'Apple', 'Kidney Beans', 'Eggs'],
           ['Milk', 'Orange', 'Corn', 'Beans', 'Yogurt'],
           ['Corn', 'Cookie', 'Cookie', 'Beans', 'Ice cream', 'Eggs']]

type(dataset)

import pandas as pd
from mlxtend.preprocessing import TransactionEncoder

te = TransactionEncoder() # 인코딩모델 
te_ary = te.fit(dataset).transform(dataset)
te_ary
df = pd.DataFrame(te_ary, columns=te.columns_)
df


#apriori
#입력: pandas DataFrame, min_support 기본값0.5, use_colnames 기본값 False, max_len 기본값 none

apriori(df, min_support=0.6)
apriori(df, min_support=0.6, use_colnames=True)

frequent_itemsets = apriori(df, min_support=0.6, use_colnames=True)

#필터링을 위해  length column 추가
frequent_itemsets['length'] = frequent_itemsets['itemsets'].apply(lambda x: len(x))
frequent_itemsets[ (frequent_itemsets['length'] == 2) & (frequent_itemsets['support'] >= 0.6) ]

 

          • 2. Clustering 
            • 정의 : Cluster 의 개수나 구조에 관한 특별한 사전 가정없이, 개체들 사이의 유사성/ 거리에 근거해 cluster 를 찾고 다음 단계의 분석을 하게 하는 기법 
            • 원리 : 유사한 개체들을 cluster로 그룹화하여 각 집단의 성격을 파악 
            • 장점 
              • 데이터를 탐색하는 기법  (거들뿐... 이걸 의사결정에 이용하면 안됨) 
              • 추가적인 분석을 위해 사용할 수 있음 
              • 유사성, 비유사성만 계산할 수 있다면 여러 형태 데이터 적용 가능
              • 분석 용이한 장점
            • 단점 
              • 자료유형이 혼합된 경우, 거리 정의 등이 어려울 수 있음 (수치나 범주가 섞여있으면 못씀) 
              • 초기군집수 설정이 중요 
              • 결과해석에 주의 
            • K-means clustering
              • k개 : 주어진 cluster 개수 
              • 절차 : k개 만큼의 cluster seed 선택 (지정/임의로 선택 등)
              • 각 개체들에 대해 cluster seed와 거리 계산하여, 가장 가까운 seed 에 개채 할당 
              • 각 개체가 seed 에 할당될 때마다 ,군집의 중심이 그 군집에 속하는 개체들의 평균 벡터로다시 계산 
              • 개체들을 가장 가까운 cluster seed에 재할당하고, 이 과정을 cluster 
#------------------------------------------------------
#1 K-means 클러스터링

import numpy as np
from sklearn import datasets

np.random.seed(5)

iris = datasets.load_iris()
X = iris.data
y = iris.target

from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=3)

#n_clusters 클러스터의 개수, 기본은 8
#n_jobs 병렬 처리 개수
#algorithm: full(EM방식), elkan(효율적 방식), auto(dense 자료에 elkan, sparse에 full)

#사용 함수
kmeans.fit(X)	#클러스터링
kmeans.fit_predict(X)	#클러스터 중심 계산 후 각 샘플의 클러스터를 예측, kmeans.labels_와 동일
kmeans.get_params()	#파라미터 출력
kmeans.predict(X[0:5,])	#입력된 X값들이 어떤 클러스터에 속할 지 계산
kmeans.predict([[0, 0, 0, 0], [1,1,4, 4]])

kmeans.transform(X)[1,]	#클러스터 중심으로부터의 거리로 변환된 값
X[1,]

#결과 활용
kmeans.labels_
kmeans.cluster_centers_
kmeans.inertia_		#각 클러스터내에서 센터와 각 자료 사이 거리 합의 제곱

 

          • 3. 그래프 : Graph mining 
            • Graph ?
              • Actors와 relations  (또는 "nodes" and "edges")으로 구성
              • Graph 는 Node들의 연결에 대한 패턴에 대해 두가지 방법으로 표현 : graph & matrix 
                • 특히 graphics 는 "socio-grams" 으로 불리기도 함 
                • 수학자들은 "directed graphs" "signed graphs" or simply "graphs" 등으로 지칭 
#----------------------------------------------------------
#networkx: 
import networkx as nx

G = nx.Graph()
G.nodes()	#노드 확인
G.edges()	#링크 확인


#node 추가
G.add_node(1)
G.add_nodes_from([2,3])

H=nx.path_graph(10)	#0~9의 노드를 갖는 그래프, 이어진 노드끼리 엣지 자동 생성
H.nodes()
G.add_nodes_from(H)	#H의 노드를 G에 추가
G.add_node(H)		#H 그래프가 추가

#edge 추가
G.add_edge(1,2)
e=(2,3)
G.add_edge(*e) 		#*을 표시해야 tuple로 부터 엣지 생성:unpack 
G.add_edges_from([(1,2),(1,3)])
G.add_edges_from(H.edges())

#measure graph
G.number_of_nodes()
G.number_of_edges()
G.neighbors(1)

#node, edge 지우기: Graph.remove_node(), Graph.remove_nodes_from(), Graph.remove_edge(), Graph.remove_edges_from()
G.remove_node(H)	#H로 부터의 노드 지우기
G.clear()		#모두 지우기

#----------------------------------------------------------
#example1
G.add_edges_from([(1,2),(1,3)])
G.add_node(1)
G.add_edge(1,2)
G.add_node("spam") # "spam" 노드가 추가
G.add_nodes_from("spam") # 문자열은 리스트이며, 각 문자가 값, 그래서's', 'p', 'a', 'm' 4개의 문자가 노드로 추가

#example2
G.remove_nodes_from("spam")
G.nodes()
G.remove_edge(1,3)

#example3
H=nx.DiGraph(G) # create a DiGraph using the connections from G
H.edges()
edgelist=[(0,1),(1,2),(2,3)]
H2=nx.Graph(edgelist)

 

          • 추천 알고리즘 : Recommendation
            • Collaborative Filtering 협업 필터링
              • User-Based Collaborative Filtering 사용자 기반 협업 필터링
              • Item-Based Collaborative Filtering 아이템 기반 협업 필터링
        • ML 적용 사례들 
          1. 미세먼지 VS 유동인구 
++ 데이터 분석 TOPIC TEN 
- 상반기 은행 실적
- 메타버스 활용 서비스 혁신 
- 머지포인트 사태
- 마이 데이터 

 

 

반응형