• 线性回归模型进行特征重要性分析


    目的

            线性回归是很常用的模型;在局部可解释性上也经常用到。

    数据归一化

            归一化通常是为了确保不同特征之间的数值范围差异不会对线性模型的训练产生过大的影响。在某些情况下,特征归一化可以提高模型的性能,但并不是所有情况下都需要进行归一化。

            归一化的必要性取决于你的数据和所使用的算法。对于某些线性模型,比如线性回归和支持向量机,数据归一化是一个常见的实践,因为它们对特征的尺度敏感。

            但对于其他算法,如决策树和随机森林,通常不需要进行归一化。

            在实际应用中,建议根据你的数据和所选用的模型来决定是否进行归一化。如果你的数据特征具有不同的尺度,并且你使用的是那些对特征尺度敏感的线性模型,那么进行归一化可能会有所帮助。否则,你可以尝试在没有归一化的情况下训练模型,然后根据模型性能来决定是否需要进行归一化。

    1. 对新数据进行归一化处理
    2. new_data_sample_scaled = scaler.transform(new_data_sample)
    3. # 使用模型进行预测
    4. predicted_value = model.predict(new_data_sample_scaled)
    5. 这样就能确保在预测新数据时,特征的尺度与训练数据保持一致。

    MinMaxScaler底层代码

    1. class MinMaxScaler Found at: sklearn.preprocessing.data
    2. class MinMaxScaler(BaseEstimator, TransformerMixin):
    3.     def __init__(self, feature_range=(0, 1), copy=True):
    4.         self.feature_range = feature_range
    5.         self.copy = copy
    6.     
    7.     def _reset(self):
    8.         """Reset internal data-dependent state of the scaler, if 
    9.          necessary.
    10.         __init__ parameters are not touched.
    11.         """
    12.     # Checking one attribute is enough, becase they are all set 
    13.      together
    14.     # in partial_fit
    15.         if hasattr(self, 'scale_'):
    16.             del self.scale_
    17.             del self.min_
    18.             del self.n_samples_seen_
    19.             del self.data_min_
    20.             del self.data_max_
    21.             del self.data_range_
    22.     
    23.     def fit(self, X, y=None):
    24.         """Compute the minimum and maximum to be used for later 
    25.          scaling.
    26.         Parameters
    27.         ----------
    28.         X : array-like, shape [n_samples, n_features]
    29.             The data used to compute the per-feature minimum and 
    30.              maximum
    31.             used for later scaling along the features axis.
    32.         """
    33.         # Reset internal state before fitting
    34.         self._reset()
    35.         return self.partial_fit(X, y)
    36.     
    37.     def partial_fit(self, X, y=None):
    38.         """Online computation of min and max on X for later scaling.
    39.         All of X is processed as a single batch. This is intended for 
    40.          cases
    41.         when `fit` is not feasible due to very large number of 
    42.          `n_samples`
    43.         or because X is read from a continuous stream.
    44.         Parameters
    45.         ----------
    46.         X : array-like, shape [n_samples, n_features]
    47.             The data used to compute the mean and standard deviation
    48.             used for later scaling along the features axis.
    49.         y : Passthrough for ``Pipeline`` compatibility.
    50.         """
    51.         feature_range = self.feature_range
    52.         if feature_range[0] >= feature_range[1]:
    53.             raise ValueError(
    54.                 "Minimum of desired feature range must be smaller"
    55.                 " than maximum. Got %s."
    56.                 str(feature_range))
    57.         if sparse.issparse(X):
    58.             raise TypeError("MinMaxScaler does no support sparse 
    59.              input. "
    60.                 "You may consider to use MaxAbsScaler instead.")
    61.         X = check_array(X, copy=self.copy, warn_on_dtype=True
    62.          estimator=self, dtype=FLOAT_DTYPES)
    63.         data_min = np.min(X, axis=0)
    64.         data_max = np.max(X, axis=0)
    65.         # First pass
    66.         if not hasattr(self, 'n_samples_seen_'):
    67.             self.n_samples_seen_ = X.shape[0]
    68.         else:
    69.             data_min = np.minimum(self.data_min_, data_min)
    70.             data_max = np.maximum(self.data_max_, data_max)
    71.             self.n_samples_seen_ += X.shape[0] # Next steps
    72.         data_range = data_max - data_min
    73.         self.scale_ = (feature_range[1] - feature_range[0]) / 
    74.          _handle_zeros_in_scale(data_range)
    75.         self.min_ = feature_range[0] - data_min * self.scale_
    76.         self.data_min_ = data_min
    77.         self.data_max_ = data_max
    78.         self.data_range_ = data_range
    79.         return self
    80.     
    81.     def transform(self, X):
    82.         """Scaling features of X according to feature_range.
    83.         Parameters
    84.         ----------
    85.         X : array-like, shape [n_samples, n_features]
    86.             Input data that will be transformed.
    87.         """
    88.         check_is_fitted(self, 'scale_')
    89.         X = check_array(X, copy=self.copy, dtype=FLOAT_DTYPES)
    90.         X *= self.scale_
    91.         X += self.min_
    92.         return X
    93.     
    94.     def inverse_transform(self, X):
    95.         """Undo the scaling of X according to feature_range.
    96.         Parameters
    97.         ----------
    98.         X : array-like, shape [n_samples, n_features]
    99.             Input data that will be transformed. It cannot be sparse.
    100.         """
    101.         check_is_fitted(self, 'scale_')
    102.         X = check_array(X, copy=self.copy, dtype=FLOAT_DTYPES)
    103.         X -= self.min_
    104.         X /= self.scale_
    105.         return X


    数据分箱

    1. n_bins = [5]
    2. kb = KBinsDiscretizer(n_bins=n_bins, encode = 'ordinal')
    3. kb.fit(X[selected_features])
    4. X_train=kb.transform(X_train[selected_features])
    1. from sklearn.preprocessing import KBinsDiscretizer
    2. import joblib
    3. # 创建 KBinsDiscretizer 实例并进行分箱
    4. est = KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='uniform')
    5. X_binned = est.fit_transform(X)
    6. # 保存 KBinsDiscretizer 参数到文件
    7. joblib.dump(est, 'kbins_discretizer.pkl')
    8. # 加载 KBinsDiscretizer 参数
    9. loaded_estimator = joblib.load('kbins_discretizer.pkl')
    10. # 使用加载的参数进行分箱
    11. X_binned_loaded = loaded_estimator.transform(X)
    12. from sklearn.preprocessing import KBinsDiscretizer
    13. def save_kbins_discretizer_params(estimator, filename):
    14. params = {
    15. 'n_bins': estimator.n_bins,
    16. 'encode': estimator.encode,
    17. 'strategy': estimator.strategy,
    18. # 其他可能的参数
    19. }
    20. with open(filename, 'w') as f:
    21. for key, value in params.items():
    22. f.write(f"{key}: {value}\n")
    23. # 创建 KBinsDiscretizer 实例并进行分箱
    24. est = KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='uniform')
    25. # 保存 KBinsDiscretizer 参数到文本文件
    26. save_kbins_discretizer_params(est, 'kbins_discretizer_params.txt')

     KBinsDiscretizer 的源代码

    1. KBinsDiscretizer 的源代码参数包括:
    2. n_bins:指定要创建的箱的数量。
    3. encode:指定编码的方法。可以是'onehot''onehot-dense''ordinal'中的一个。
    4. strategy:指定分箱的策略。可以是'uniform''quantile''kmeans'中的一个。
    5. dtype:指定输出数组的数据类型。
    6. bin_edges_:一个属性,它包含每个特征的箱的边界。
    7. 以下是 KBinsDiscretizer 类的源代码参数的简要说明:
    8. n_bins:用于指定要创建的箱的数量。默认值为5
    9. encode:指定编码的方法。可选值包括:
    10. 'onehot':使用一热编码。
    11. 'onehot-dense':使用密集矩阵的一热编码。
    12. 'ordinal':使用整数标签编码。默认为 'onehot'
    13. strategy:指定分箱的策略。可选值包括:
    14. 'uniform':将箱的宽度保持相等。
    15. 'quantile':将箱的数量保持不变,但是每个箱内的样本数量大致相等。
    16. 'kmeans':将箱的数量保持不变,但是使用 k-means 聚类来确定箱的边界。默认为 'quantile'
    17. dtype:指定输出数组的数据类型。默认为 np.float64
    18. bin_edges_:一个属性,它包含每个特征的箱的边界。这是一个列表,其中每个元素都是一个数组,表示相应特征的箱的边界。
    19. 您可以在 sklearn/preprocessing/_discretization.py 中找到 KBinsDiscretizer 类的完整源代码,以查看详细的参数和实现细节。

  • 相关阅读:
    【探索Spring底层】3.Bean生命周期与Bean后处理器
    SQL note1:Basic Queries + Joins & Subqueries
    一文搞懂CAN总线协议
    pat多项式求和
    LLaMa
    轻量应用云服务器如何部署SpringBoot项目(jar包形式)?
    ROS2进阶:在windows10上用vs2019编译rviz2
    ATF(TF-A) EL3 SPMC威胁模型-安全检测与评估
    基于模糊控制算法的快速反射镜 系统扰动抑制
    网络安全笔记7——防火墙技术
  • 原文地址:https://blog.csdn.net/as472780551/article/details/133685530