답 → 3번 : 엔트로피 불순도 또한 낮을수록 분류하기 쉽다.
5번 : 특성 중요도가 낮다는 것의 의미는 낮은 층에 해당하는, 세세하게 클래스를 분류하는 노도의 테스트이거나 혹은 테스트에 사용되지 않는 특성이라는 의미이므로 특성 중요도가 낮다고 해서 그 특성이 유용하지 않는다는 뜻은 아니다.
답 → 1번 : 데이터의 개수만큼 복원 추출한다는 것이 표본집단과 모집단의 개수간의 관계를 설명한다고 보기는 어렵다.
3번 : 엑스트라 트리의 경우, 랜덤 포레스트보다 무작위성이 좀 더 크기에 더 많은 결정 트리를 훈련해야 한다. 하지만 노드를 랜덤하게 분할하기 때문에 오히려 랜덤 포레스트보다 계산 속도가 더 빠르다.
4번 : 랜덤 포레스트의 각 트리가 과적합될 수는 있으나, 각 트리 중 과적합 된 특성들을 피하고자 랜덤하게, 여러개의 트리를 만드는 것이므로 각 트리의 연관성이 낮을수록 성능이 높아진다고 볼 수 있다.



import pandas as pd
fish = pd.read_csv('<https://bit.ly/fish_csv_data>')
fish_input = fish[['Weight','Length','Diagonal','Height','Width']].to_numpy()
fish_target = fish['Species'].to_numpy()
#data split
from sklearn.model_selection import train_test_split
train_input, test_input, train_target, test_target = train_test_split(
fish_input, fish_target, random_state=42)
#preprocessing
from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
ss.fit(train_input)
train_scaled = ss.transform(train_input)
test_scaled = ss.transform(test_input)
#LR
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression(C=20, max_iter=1000)
lr.fit(train_scaled, train_target)
print('GridSearch 사용 전')
print(lr.score(train_scaled, train_target))
print(lr.score(test_scaled, test_target))
#GridSearch 시작
from sklearn.model_selection import GridSearchCV
params = {'C' : range(1, 101)}
gs = GridSearchCV(LogisticRegression(max_iter = 1000), params, n_jobs = -1)
gs.fit(train_scaled, train_target)
print('GridSearch 사용 후')
print(gs.score(train_scaled, train_target))
print(gs.score(test_scaled, test_target))
print('GridSearch에서 찾아낸 최적의 C값')
print(gs.best_params_)
#찾은 값을 토대로 직접 LR 모델에 적용해보기
lr = LogisticRegression(C = 97, max_iter = 1000)
lr.fit(train_scaled, train_target)
print(lr.score(train_scaled, train_target))
print(lr.score(test_scaled, test_target))