乔人尹 - ML
type: channel
link: https://underestimated.cn/tag/ML/
items: Scikit-learn：从入门到放弃

Scikit-learn：从入门到放弃
type: item
date: 2023-04-22T03:09:00+00:00
description: 第一章：相遇——"这也太简单了吧！"每个机器学习初学者都曾有过这样的蜜月期。from sklearn.linear_model import LinearRegression model = LinearRegression() model.fit(X, y) predictions = model.predict(X_test)三行代码，一个模型。你开始觉得自己是天选之子，机器学习不过如此。你甚至开始在简历上写"精通机器学习"。这时候的你，笑容灿烂，头发茂密。第二章：热恋——"Sklearn真是个宝藏！"你发现Sklearn就像一个百宝箱： # 数据预处理？有！ from sklearn.preprocessing import StandardScaler, MinMaxScaler, LabelEncoder # 特征选择？有！ from sklearn.feature_selection import SelectKBest, RFE # 模型选择？应有尽有！ from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier from sklearn.svm import SVC from sklearn.neighbors import KNeighborsClassifier # 交叉验证？当然有！ from sklearn.model_selection import cross_val_score, GridSearchCV你开始疯狂收藏各种模型，就像收集宝可梦一样。每天的口头禅变成了"这个问题用RandomForest试试"。第三章：磨合期——"等等，为什么报错了？"3.1 维度地狱 model.fit(X, y) # ValueError: Expected 2D array, got 1D array instead` 你盯着屏幕，心想：我的X明明是个数组啊？ 然后你学会了： python `X = X.reshape(-1, 1) # 从此reshape成为你最熟悉的朋友3.2 类型陷阱 # 你以为这样就行了 df['category'] = df['category'].astype('category') # Sklearn冷笑一声 # ValueError: could not convert string to float原来Sklearn对字符串过敏，你必须： from sklearn.preprocessing import LabelEncoder, OneHotEncoder # 或者更现代的方式 from sklearn.compose import ColumnTransformer from sklearn.preprocessing import OneHotEncoder preprocessor = ColumnTransformer( transformers=[ ('cat', OneHotEncoder(), categorical_columns), ('num', StandardScaler(), numerical_columns) ])此时你开始感受到一丝不安。3.3 缺失值恐惧症 model.fit(X, y) # ValueError: Input contains NaN` Sklearn对NaN的态度就像你妈对你单身的态度——零容忍。 python `from sklearn.impute import SimpleImputer imputer = SimpleImputer(strategy='mean') # 或者 'median', 'most_frequent' X_clean = imputer.fit_transform(X)第四章：争吵期——"Pipeline是什么鬼？"当你的预处理步骤越来越多，代码开始变成意大利面： # 你的代码 scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) X_test_scaled = scaler.transform(X_test) # 注意！是transform不是fit_transform selector = SelectKBest(k=10) X_train_selected = selector.fit_transform(X_train_scaled, y_train) X_test_selected = selector.transform(X_test_scaled) model = RandomFore…