ZeroR : 최소 이정도보다 나아야 된다. ex) 어느 지역에서는 매일 비가 와서. 내일 비올 확률 85퍼라고 하면 거의 다 맞음
결과 변수가 연속적일때 사용.
특정 범위 내 모든 값을 가질 수 있음. ex) 온도, 주택가격
예측 변수와 결과 변수 사이의 선형 관계를 모델링 해 가장 적합한 선을 찾는것
연속 결과 변수와 예측 변수 사이의 선형 관계를 모델링
결과 변수가 이항 또는 범주형일 때 사용 ex) 성공/실패, 존재/부재
예측 변수에서 범주 중 하나에 속하는 결과 변수의 확률을 모델링
예측 변수가 주어진 이진 결과 변수 모델링
b_cancer = load_breast_cancer()
# sklearn.datasets 에서 얻어옴
b_cancer_df= pd.DataFrame(b_cancer.data, columns = b_cancer.feature_names)
# 참고) pd.DataFrame(data, index, columns,dtype,copy)
index = 행
columns = 열
dtype = 전체 데이터 프레임의 데이터 유형 강제
copy = df 를 생성할때 데이터를 복사할지 여부
b_cancer_df['diagnosis']= b_cancer.target
target 값을 포함하지 않으면 분석하고 싶은 값[ex)진단] 에 대한 중요한 정보가 누락되어
의미 있는 인사이트를 도출하거나 데이터 집합을 기반으로 예측 모델을 구축하기가 어려워집니다.
또 대부분의 dataSet 에 target값이 이미 있음.
이걸 꺼내서 받아주는것
데이터 세트의 기능 또는 변수 범위를 표준화하는 데 사용되는 사전 처리 기술
=> 모든 기능이 유사한 척도를 갖도록 보장.
cf) scale은 측정값을 동일한 단위로 변환하는 것과 비슷.
예를들면, 박스 길이 측정하는데 길이는 미터로, 넓이는 센치미터로 측정하면 데이터 비교하기 어려운느낌!
입력 값 범위에 민감한 많은 기계 학습 알고리즘에 유용하게 쓰임.
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler() # scaler 생성
b_cancer_scaled = scaler.fit_transform(b_cancer.data) # input 값을 scale 한다
print (b_cancer_scaled)
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
# X, Y 설정하기
Y = b_cancer_df['diagnosis']
X = b_cancer_scaled
# 훈련용 데이터와 평가용 데이터 분할하기
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=0)
# (1)모델 생성
lr_b_cancer = LogisticRegression()
# (2)모델 훈련
lr_b_cancer.fit(X_train, Y_train)
# (3)평가 데이터에 대한 예측 수행 -> 예측 결과 Y_predict 구하기
Y_predict = lr_b_cancer.predict(X_test)
from sklearn.metrics import confusion_matrix, accuracy_score
from sklearn.metrics import precision_score, recall_score, f1_score, roc_auc_score
# 혼돈행렬
print (confusion_matrix(Y_test, Y_predict))
예측된 클래스와 실제 클래스를 비교하여 분류 모델의 성능을 평가
참 긍정(TP), 참 부정(TN), 거짓 긍정(FP) 및 거짓 부정(FN) 예측의 수를 나타내는 4개의 항목이 있는 행렬
진양성(TP): 모델에 의해 양성으로 올바르게 분류
True Negatives(TN): 모델에 의해 부정으로 올바르게 분류
False Positives(FP): 모델에 의해 양성으로 잘못 분류
False Negatives(FN): 모델에서 부정확하게 부정확하게 분류
양성이라고 판정한 것 중 진짜로 맞는 것 ex)진단키트를 돌렸는데 1000명중 100명만 진짜더라
긍정적인 인스턴스를 예측할 때 모델이 얼마나 정확한지 측정
진양성(TP)과 거짓양성(FP)의 합에 대한 진양성(TP)의 비율
precision = TP / (TP + FP)
높은 정밀도는 모델이 양성 인스턴스를 예측할 때 매우 정확합니다.
얼마나 많은 것이 참인지 또는 올바른지 나타낸다.
ex) 특정이미지에 고양이가 포함되어 있다고 예측했는데 진짜 있으면 예측이 '정확'한것.
ex) 의료 진단 작업에서 '정확한' 모델은 매우 확신이 있을때에만 예측을함. => 일부 질병 사례를 놓칠 수 있음.
있는 양성을 찾아낸 비율
모델에 의해 올바르게 식별된 긍정적 인스턴스의 비율을 측정합니다.
높은 재현율은 대부분의 긍정적 인스턴스를 식별할 수 있음을 의미 => 긍정적 인스턴스를 식별할 때 모델이 매우 완전
진양성(TP)과 거짓음성(FN)의 합에 대한 진양성(TP)의 비율
recall = TP / (TP + FN)
ex) 의료 작업에서 높은 재현율이 훨씬 중요.
일부 거짓 양성을 허용하더라도 모든 참 양성 사례를 식별
ex) 의료 진단 작업에서 '완전한' 모델은 특정 질병의 모든 인스턴스를 식별(if FT가 껴 있더라도)
acccuracy = accuracy_score(Y_test, Y_predict) #정확도
precision = precision_score(Y_test, Y_predict) #정밀도
recall = recall_score(Y_test, Y_predict) #재현율
f1 = f1_score(Y_test, Y_predict) #정밀도와 재현율의 조화 평균.
불균형 데이터 세트를 처리할 때 유용. 0~1 값이며, 1이 가장 좋음
roc_auc: ROC-AUC 점수
# 포지티브 클래스와 네거티브 클래스를 구별하는 모델의 능력
0~1 값이며, 1이 완벽. 0.5는 무작위
차원 축소 기법. 원래 정보를 최대한 보존하면서 기능(차원) 수를 줄임으로써 복잡한 데이터 세트를 단순화하는 데 도움!
사실, scale 후 모델학습 전에 해야함.
but, 데이터 유출을 방지하려면 1. 모델 학습 먼저하고 2. scale 3.트레이닝 세트에서 PCA 로 차원 줄인후 테스트 세트 변환. 4. 변환된 트레이닝 세트로 모델 트레이닝. 5. 모델 평가
from sklearn import decomposition
pca = decomposition.PCA(n_components=8) #PCA 개체 만들기
#n_components는 주성분 수로 n_components=8은 변환된 데이터 셋에 8개의 주성분이 있다!
pca.fit(b_cancer_scaled) # PCA개체를 데이터 세트에 맞추기
b_cancer_pca = pca.transform(b_cancer_scaled) #차원 축소
# 1. X, Y 설정하기
Y = b_cancer_df['diagnosis']
X = b_cancer_pca #pca 후 데이터
# 2. 훈련용 데이터와 평가용 데이터 분할하기
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=0)
# 3. 로지스틱 회귀 분석 : (1)모델 생성
lr_b_cancer = LogisticRegression()
# 4. 로지스틱 회귀 분석 : (2)모델 훈련
lr_b_cancer.fit(X_train, Y_train)
# 5. 로지스틱 회귀 분석 : (3)평가 데이터에 대한 예측 수행 -> 예측 결과 Y_predict 구하기
Y_predict = lr_b_cancer.predict(X_test)
ex) 한 장의 종이에 많은 점이 있고 파란색 점과 빨간색 점을 구분하는 선을 긋고 싶다고 상상해 보십시오. SVC()는 컴퓨터가 최적의 선(또는 곡선)을 찾도록 도와줌
모델 훈련 -> scale 조정 -> svc 모델 훈련 -> 예측 및 평가
# 1. 데이터 셋 로드
iris = datasets.load_iris()
X = iris.data
y = iris.target
# 2. 데이터 세트를 교육 및 테스트 세트로 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 3. 데이터 스케일 조정
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# 4. SVM 모델 훈련
model = SVC()
model.fit(X_train, y_train)
# 5. 예측
y_pred = model.predict(X_test)
# 6. 모델 평가
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)
feature_name_df = pd.read_csv('data2/features.txt', sep='\s+', header=None, names=['index', 'feature_name'], engine='python')```
from sklearn.metrics import confusion_matrix
print (confusion_matrix(Y_test, Y_predict))
행렬 대각선 외에 것들은 삐져나온값
찾아주는 라이브러리가 있다 gridSearchCV
후보군을 주면 max_depth 차원이 깊어짐.
깊게 트리를 만드는걸 허용 X 면 옆으로 뚱뚱한 트리 나와
# oneHot 인코딩
숫자지만 그 숫자에 의미가 없으면 이것도 인코딩해줘야해 ex) 지역번호 서울 02,경기 031 => 숫자가 커진다고 의미가 있는게 아니니까
![](https://velog.velcdn.com/images/mpfo0106/post/7cca77fa-8d0d-42d3-94ac-b3faf1200cf6/image.png)
#na를 드롭을 했는데 인덱스가 남아있어. 새로만든 df는 이게 안빠져있는데 그래서 합쳐지면 문제가돼. => reset index를 drop 하고 필히 해줘야함