학생이 공부한 시간을 기반으로 시험에서 학생의 점수를 예측한다고 가정해 보십시오.
선형 회귀는 직선을 사용하여 공부한 시간과 시험 점수 사이의 관계를 찾을 수 있다!
선이 올라가면 학생들이 더 많이 공부할수록 일반적으로 시험 점수가 올라간다는 의미입니다.
data_df.shape , data_df.info()
data_df = data_df.drop(['car_name', 'origin'], axis=1, inplace=False)
data_df.horsepower=data_df.horsepower.replace('?', np.NaN)
or
data_df=data_df.dropna()
#후에
data_df.horsepower= data_df.horsepower.astype('int')
# X,Y 분할
Y = data_df['mpg']
X = data_df.drop(['mpg'], axis=1, inplace=False)
# 훈련용 데이터와 평가용 데이터 분할하기
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=1)
test_size는 데이터 세트의 비율을 지정
test_size=0.2는 데이터 세트의 20%가 평가 데이터에 할당되고 80%가 학습 데이터에 할당됨.
random_state는 데이터 세트의 무작위 셔플링을 제어
값은 정수이며 고정 값으로 설정하면 코드가 실행될 때마다 동일한 분할이 얻어집니다
if 지정하지 않으면) 임의의 값이 사용되므로 코드가 실행될 때마다 다른 분할이 발생
# 모델생성
lr = LinearRegression()
# 훈련
lr.fit(X_train, Y_train)
# 예측
Y_predict = lr.predict(X_test)
# 기울기 값
coef = pd.Series(data=np.round(lr.coef_, 2), index=X.columns)
# 참고로 계수가 클수록 독립 변수가 종속 변수에 미치는 영향이 더 크다는 의미입니다.
# mse, rmse 분석
mse = mean_squared_error(Y_test, Y_predict)
rmse = np.sqrt(mse)
print('MSE : {0:.3f}, RMSE : {1:.3f}'.format(mse, rmse))
fig, axs = plt.subplots(figsize=(16, 16), ncols=3, nrows=2)
sns.regplot(x=feature, y='mpg', data=data_df, ax=axs[row][col], color=plot_color[i])
sns subplot을 이용해서 그래프를 그린다.
예측 값과 실제 값 사이의 제곱 차이의 평균을 계산
오류를 제곱함으로써 MSE는 더 큰 오류에 더 많은 가중치를 부여하고 이상값에 민감해짐
낮은 MSE는 모델의 예측이 실제 값에 더 가깝다는 것을 의미하므로 더 나은 모델 적합성을 보여줌.
다중 공선성, 많은 수의 기능 또는 잡음이 있는 데이터를 처리할 때 일반 선형 회귀보다 훌륭.
But, 정규화 기간이 제대로 선택되지 않으면 모델의 성능이 저하됨.
ex) linear_model.Ridge(alpha=.5)
=> 정규화의 강도를 제어하는 매개변수
'alpha'가 0으로 설정되면 Ridge 회귀는 일반 최소 제곱 선형 회귀와 동일하게 됩니다(정규화가 적용되지 않음).
alpha 값을 높게 설정하면 정규화가 더 많이 적용되고 모델이 과적합에 더 강해집니다.
가장 적합한 값을 찾으려면 실험이나 교차 검증과 같은 기술을 사용해야 합니다.
모델이 학습 데이터에서 잘 수행되지만 보이지 않는 새로운 데이터(테스트 시)에 잘 일반화되지 않을 때 발생하는것.
ex) 모의고사는 잘보는데, 수능에서 망하는 느낌?ㅎ
과적합 감소: 베스트 기능만 선택하면 과적합 감소
모델 성능 향상: 모델의 복잡성을 줄임
복잡성 감소 : 더 적은 기능으로 교육하면 가성비 굳
instance of SelectKBest를 생성하는 것
k는 선택할 상위 기능('k')의 수를 지정
데이터 셋을 '폴드' 라고 하는 여러 하위집합으로 분할하기
본 적 없는 데이터 모델
성능을 비교해 최상의 모델을 선택할 때
from sklearn.model_selection import KFold
kf = KFold(n_splits=k, shuffle=True, random_state=42)
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
lr = LinearRegression()
mse_scores = []
for train_index, val_index in kf.split(X):
X_train, X_val = X[train_index], X[val_index]
y_train, y_val = y[train_index], y[val_index]
lr.fit(X_train, y_train)
y_pred = lr.predict(X_val)
mse = mean_squared_error(y_val, y_pred)
mse_scores.append(mse)
mse_scores # List of mean squared error values for each fold
avg_mse = sum(mse_scores) / k
print("Average Mean Squared Error:", avg_mse)
inplace=True 는 원본 DataFrame이 수정됩니다. 새로운 DataFrame이 생성되지 않습니다.
inplace=False 는 원래 DataFrame은 변경되지 않은 상태로 유지됩니다.
즉, 'car_name' 및 'origin' 열이 제거된 새 DataFrame이 생성되고 원래 DataFrame 'data_df'는 변경되지 않고 유지됩니다.
figsize: 전체 그림의 너비와 높이를 인치 단위로 설정합니다. 이 경우 너비와 높이가 모두 16인치임을 의미하는 (16, 16)으로 설정됩니다.
ncols: 서브플롯 그리드의 열 수
nrows: 서브플롯 그리드의 행 수