

-> 위에처럼 너무 구분이 안될정도면, 보통 피처를 잘못 선택했거나, 결측치를 잘못 채웠다고 판단한다.
-> 피처선택을 다시하고 결측치를 다시 채운다.
model = LogisticRegression(max_iter=200)
model.fit(train_X,train_y)
prediction=model.predict(test_X)
print('The accuracy of the Logistic Regression is',metrics.accuracy_score(prediction,test_y))
# stratify에 아무것도 안줬을때
x_train, x_test, y_train, y_test= train_test_split(x_data,
y_data,
test_size=0.30,
random_state=97,
# # stratify=y_data
)
y_test.value_counts()

-> 테스트 데이터 비율이 종에 따라 다른 것을 볼 수 있다.
1) stratify O
x_train, x_test, y_train, y_test= train_test_split(x_data,
y_data,
test_size=0.30,
random_state=97,
stratify=y_data
)
y_test.value_counts()

-> 테스트 데이터 비율이 골고루 뽑힌 것을 확인
공식문서 :
- 학습된 데이터와 테스트데이터를 비교했을때, 테스트 데이터중 가장 가까운 것을 기준으로 판단하여 분류한다.
훈련 데이터를 공간에 뿌리고
테스트 데이터가 입력되면
테스트 데이터를 중심으로 정의된 거리(default = Euclidean)에서 가까운 n_neighbors개의 점을 찾는다.
n_neighbors개 점의 라벨을 조사하고 가장 많은 라벨로 테스트 데이터의 라벨을 결정한다.
모델 파라미터(일반적으로 말하는 파라미터를 의미): 모델이 학습 하면서 변화하게 되는 값. 딥러닝 모델의 경우 가중치가 파라미터
하이퍼 파라미터(매개변수): 모델의 학습 전에 설정해 주는 값. 아무런 설정도 하지 않으면 기본값(default)로 학습하게 됨
주요 하이퍼 파라미터

공식문서 : https://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html
모든 학습한 피처마다 각각 계산하여 높은 정보획득값을 구한다. 그리고 두갈래로 나눠지면서 엔트로피/지니계수가 낮아지는 방향으로 진행한다.
주요 사용 하이퍼 파라미터
디시전트리는 어차피 기준이 피처의 값으로 들어가기 때문에 스케일링을 안해도 된다.
피처 테스트 데이터 스케일링 : MinMaxScaler().transform(x_test)
-> 헷갈리지 말고 꼭 그냥 transform!!!!
피처 트레인 데이터 스케일링 : MinMaxScaler().fit_transform(x_train)
KNN에서 거리 값이 같다면, 피처의 이름 순서로 포함하게된다.
-> 이것은 predict()가 predict_proba()의 np.argmax() 값으로 나타나기 때문이다.
-> 가장 큰 값의 인덱스를 받은다음에 출력하기 때문에 같은 거리라면 이름 순이 우선순위를 가진다.
튜닝 : 기존 모델의 파라미터를 조정하여 모델의 성능을 향상시키는 행위
머신러닝 프로세스
1) x_data 에 넣을 피처를 선택하여 입력한다
2) y_data 는 정답을 넣는다.
3) train_test_split 을 이용하여 훈련/테스트 데이터 생성
-> random_state , stratify, test_size
4) 훈련데이터 스케일링
-> fit_transform()
5) 테스트 데이터 스케일링
-> transform()
6) 머신러닝에 넣고 테스트 데이터와 비교하여 정확도 확인
-> predict(), metrics.accuracy_score()
model.feature_importances_



데이터의 결측과 수치화
categorical로 지정이상치(혹은 노이즈)
matplotlib, seaborn 시각화
상관관계
스케일링
차원축소
iris = pd.read_csv(r"E:\est\kdt\data\iris\iris_kaggle.csv",
index_col=0
)
x_data = iris[iris.columns[:-1]]
y_data = iris["Species"]
x_train, x_test, y_train, y_test = train_test_split(x_data,
y_data,
test_size=0.30,
random_state = 97)
model = DecisionTreeClassifier(max_depth = 3, random_state=97)
model.fit(x_train.values, y_train.values)
# np.max(x_train['PetalWidthCm']), np.min(x_train['PetalWidthCm'])
x_train['att']=y_train
def gini(dic):
g = []
for k in dic:
g.append((dic[k]/sum(dic.values()))**2)
return 1-sum(g)
def n_sum(dic):
return sum(dic.values())
p_gini = 0.666
p_num = 105
fig, ax = plt.subplots(figsize=(8,5))
ax.plot([0.8,0.8], [0, 0.35], color="red", ls = "--")
ax.set(xlabel='피처 구분 값', ylabel="정보이득값", title="피처별 정보이득 그래프" )
for col in x_train.columns[:-1]:
ig_list = []
ig=0
max_list = []
max_ig=0
basis = np.arange(x_train[col].min(), x_train[col].max()+0.1, 0.1)
for i in basis:
l_cnt= dict(x_train[x_train[col]<= i]['att'].value_counts())
r_cnt= dict(x_train[x_train[col]> i]['att'].value_counts())
ig = p_gini - n_sum(r_cnt)/p_num*gini(r_cnt) - n_sum(l_cnt)/p_num*gini(l_cnt)
ig_list.append(ig)
max_ig=max(ig_list)
if ig == max_ig:
max_i = i
for j in range(len(ig_list)):
if ig_list[j] == max_ig:
max_list.append(round(basis[j],2))
sns.lineplot(x=basis,
y=ig_list,
label=col
)
print('{}의 크기{}에서 Information Gain 값은 {:.3f}입니다.'.format(col,max_list,max_ig))

생각보다 만만하지 않았다. 머릿속으로 구현한 것이 두루뭉실해서, 마음만큼 쉽게 그려지지 않았다. 구상을하면 바로 코드가 떠올라서 시작해야하는데, 구상을 잡기가 매우 어려웠다. 이렇게 저렇게 시도를하면서 가닥을 잡아나가다보니, 코드가 생각보다 더러웠다. zip, enumerate, iterrow, item 따위의 함수를 썼으면 좀더 깔끔하게 썼을 것이라고 생각한다.
하면서 이미 적은 것을 활용하여 하려다보니, 주먹구구식으로 작성자인 나도 쉽게 알기 어려운 코드가되었다. 좀더 부단히 연습해서 알아보기 쉽게, 빠르게 구상할 수 있는 실력이 되어야겠다.