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

目的

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

数据归一化

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

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

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

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

 对新数据进行归一化处理
new_data_sample_scaled = scaler.transform(new_data_sample)

# 使用模型进行预测
predicted_value = model.predict(new_data_sample_scaled)
这样就能确保在预测新数据时,特征的尺度与训练数据保持一致。

MinMaxScaler底层代码

class MinMaxScaler Found at: sklearn.preprocessing.data

class MinMaxScaler(BaseEstimator, TransformerMixin):

    def __init__(self, feature_range=(0, 1), copy=True):
        self.feature_range = feature_range
        self.copy = copy
    
    def _reset(self):
        """Reset internal data-dependent state of the scaler, if 
         necessary.

        __init__ parameters are not touched.
        """
    # Checking one attribute is enough, becase they are all set 
     together
    # in partial_fit
        if hasattr(self, 'scale_'):
            del self.scale_
            del self.min_
            del self.n_samples_seen_
            del self.data_min_
            del self.data_max_
            del self.data_range_
    
    def fit(self, X, y=None):
        """Compute the minimum and maximum to be used for later 
         scaling.

        Parameters
        ----------
        X : array-like, shape [n_samples, n_features]
            The data used to compute the per-feature minimum and 
             maximum
            used for later scaling along the features axis.
        """
        # Reset internal state before fitting
        self._reset()
        return self.partial_fit(X, y)
    
    def partial_fit(self, X, y=None):
        """Online computation of min and max on X for later scaling.
        All of X is processed as a single batch. This is intended for 
         cases
        when `fit` is not feasible due to very large number of 
         `n_samples`
        or because X is read from a continuous stream.

        Parameters
        ----------
        X : array-like, shape [n_samples, n_features]
            The data used to compute the mean and standard deviation
            used for later scaling along the features axis.

        y : Passthrough for ``Pipeline`` compatibility.
        """
        feature_range = self.feature_range
        if feature_range[0] >= feature_range[1]:
            raise ValueError(
                "Minimum of desired feature range must be smaller"
                " than maximum. Got %s." % 
                str(feature_range))
        if sparse.issparse(X):
            raise TypeError("MinMaxScaler does no support sparse 
             input. "
                "You may consider to use MaxAbsScaler instead.")
        X = check_array(X, copy=self.copy, warn_on_dtype=True, 
         estimator=self, dtype=FLOAT_DTYPES)
        data_min = np.min(X, axis=0)
        data_max = np.max(X, axis=0)
        # First pass
        if not hasattr(self, 'n_samples_seen_'):
            self.n_samples_seen_ = X.shape[0]
        else:
            data_min = np.minimum(self.data_min_, data_min)
            data_max = np.maximum(self.data_max_, data_max)
            self.n_samples_seen_ += X.shape[0] # Next steps
        data_range = data_max - data_min
        self.scale_ = (feature_range[1] - feature_range[0]) / 
         _handle_zeros_in_scale(data_range)
        self.min_ = feature_range[0] - data_min * self.scale_
        self.data_min_ = data_min
        self.data_max_ = data_max
        self.data_range_ = data_range
        return self
    
    def transform(self, X):
        """Scaling features of X according to feature_range.

        Parameters
        ----------
        X : array-like, shape [n_samples, n_features]
            Input data that will be transformed.
        """
        check_is_fitted(self, 'scale_')
        X = check_array(X, copy=self.copy, dtype=FLOAT_DTYPES)
        X *= self.scale_
        X += self.min_
        return X
    
    def inverse_transform(self, X):
        """Undo the scaling of X according to feature_range.

        Parameters
        ----------
        X : array-like, shape [n_samples, n_features]
            Input data that will be transformed. It cannot be sparse.
        """
        check_is_fitted(self, 'scale_')
        X = check_array(X, copy=self.copy, dtype=FLOAT_DTYPES)
        X -= self.min_
        X /= self.scale_
        return X

数据分箱

n_bins = [5]
kb = KBinsDiscretizer(n_bins=n_bins, encode = 'ordinal')
kb.fit(X[selected_features])
X_train=kb.transform(X_train[selected_features])

from sklearn.preprocessing import KBinsDiscretizer
import joblib

# 创建 KBinsDiscretizer 实例并进行分箱
est = KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='uniform')
X_binned = est.fit_transform(X)

# 保存 KBinsDiscretizer 参数到文件
joblib.dump(est, 'kbins_discretizer.pkl')

# 加载 KBinsDiscretizer 参数
loaded_estimator = joblib.load('kbins_discretizer.pkl')

# 使用加载的参数进行分箱
X_binned_loaded = loaded_estimator.transform(X)

from sklearn.preprocessing import KBinsDiscretizer

def save_kbins_discretizer_params(estimator, filename):
    params = {
        'n_bins': estimator.n_bins,
        'encode': estimator.encode,
        'strategy': estimator.strategy,
        # 其他可能的参数
    }
    
    with open(filename, 'w') as f:
        for key, value in params.items():
            f.write(f"{key}: {value}\n")

# 创建 KBinsDiscretizer 实例并进行分箱
est = KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='uniform')

# 保存 KBinsDiscretizer 参数到文本文件
save_kbins_discretizer_params(est, 'kbins_discretizer_params.txt')

KBinsDiscretizer 的源代码

KBinsDiscretizer 的源代码参数包括:

n_bins:指定要创建的箱的数量。
encode:指定编码的方法。可以是'onehot'、'onehot-dense'、'ordinal'中的一个。
strategy:指定分箱的策略。可以是'uniform'、'quantile'、'kmeans'中的一个。
dtype:指定输出数组的数据类型。
bin_edges_:一个属性,它包含每个特征的箱的边界。
以下是 KBinsDiscretizer 类的源代码参数的简要说明:

n_bins:用于指定要创建的箱的数量。默认值为5。
encode:指定编码的方法。可选值包括:
'onehot':使用一热编码。
'onehot-dense':使用密集矩阵的一热编码。
'ordinal':使用整数标签编码。默认为 'onehot'。
strategy:指定分箱的策略。可选值包括:
'uniform':将箱的宽度保持相等。
'quantile':将箱的数量保持不变,但是每个箱内的样本数量大致相等。
'kmeans':将箱的数量保持不变,但是使用 k-means 聚类来确定箱的边界。默认为 'quantile'。
dtype:指定输出数组的数据类型。默认为 np.float64。
bin_edges_:一个属性,它包含每个特征的箱的边界。这是一个列表,其中每个元素都是一个数组,表示相应特征的箱的边界。
您可以在 sklearn/preprocessing/_discretization.py 中找到 KBinsDiscretizer 类的完整源代码,以查看详细的参数和实现细节。
相关推荐
就爱学编程4 分钟前
重生之我在异世界学编程之C语言小项目:通讯录
c语言·开发语言·数据结构·算法
B站计算机毕业设计超人5 分钟前
计算机毕业设计PySpark+Hadoop中国城市交通分析与预测 Python交通预测 Python交通可视化 客流量预测 交通大数据 机器学习 深度学习
大数据·人工智能·爬虫·python·机器学习·课程设计·数据可视化
学术头条9 分钟前
清华、智谱团队:探索 RLHF 的 scaling laws
人工智能·深度学习·算法·机器学习·语言模型·计算语言学
18号房客14 分钟前
一个简单的机器学习实战例程,使用Scikit-Learn库来完成一个常见的分类任务——**鸢尾花数据集(Iris Dataset)**的分类
人工智能·深度学习·神经网络·机器学习·语言模型·自然语言处理·sklearn
feifeikon17 分钟前
机器学习DAY3 : 线性回归与最小二乘法与sklearn实现 (线性回归完)
人工智能·机器学习·线性回归
古希腊掌管学习的神21 分钟前
[机器学习]sklearn入门指南(2)
人工智能·机器学习·sklearn
Schwertlilien42 分钟前
图像处理-Ch4-频率域处理
算法
IT猿手1 小时前
最新高性能多目标优化算法:多目标麋鹿优化算法(MOEHO)求解TP1-TP10及工程应用---盘式制动器设计,提供完整MATLAB代码
开发语言·深度学习·算法·机器学习·matlab·多目标算法
__lost1 小时前
MATLAB直接推导函数的导函数和积分形式(具体方法和用例)
数学·算法·matlab·微积分·高等数学
thesky1234561 小时前
活着就好20241224
学习·算法