用户新增预测挑战赛N2

282 阅读17分钟

🐋零碎知识点

🐋一、解决

1.分类

字段x1至x8为用户相关的属性,为匿名处理字段。添加代码对这些数据字段的取值分析,那些字段为数值类型?那些字段为类别类型?

#使用python中的数据分析库pandas
import pandas as pd
​
#读取数据
train_data = pd.read_csv('用户新增预测挑战赛公开数据/train.csv')
​
#查看字段的数据和取值范围
for column in ['x1','x2','x3','x4','x5','x6','x7','x8']:
    column_type = train_data[column].dtype
    unique_values = train_data[column].unique()
    print(f'{column}:{column_type} - {unique_values}')
2.箱线图

对于数值类型的字段,考虑绘制在标签分组下的箱线图

#导入Seaborn库中的'sns.boxplot()'方法
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
​
#读取数据集
train_data = pd.read_csv('用户新增预测挑战赛公开数据/train.csv')
​
#数据类型字段
numeric_fields = ['x1','x2','x3','x4','x5','x6','x7','x8']
​
#绘制箱线图
for field in numeric_fields:
    plt.figure(figsize=(8,6))
    sns.boxplot(x='target',y=field,data=train_data)
    plt.title('Boxplot of {}'.format(field))
    plt.show()
3.绘制

common_ts中提取小时,绘制每小时下标签分布的变化。

使用条形图可视化

import pandas as pd
from collections import Counter
import matplotlib.pyplot as plt
train_data = pd.read_csv('用户新增预测挑战赛公开数据/train.csv')
​
# 使用 pd.to_datetime() 函数将时间戳列转换为 datetime 类型
train_data['common_ts'] = pd.to_datetime(train_data['common_ts'], unit='ms')
​
# 使用 dt.hour 属性从 datetime 列中提取小时信息,并将提取的小时信息存储在新的列 'common_ts_hour'
train_data['common_ts_hour'] = train_data['common_ts'].dt.hour
​
#计数器
labels_counter = Counter(train_data.common_ts_hour)
​
#条形图
plt.bar(labels_counter.keys(),labels_counter.values())
plt.xlabel('Hour')
plt.ylabel('Counts')
plt.title('Label Distribution by Hour')
plt.show()
4.直方图

udmap进行onehot,统计每个key对应的标签均值,绘制直方图。

import pandas as pd
import numpy as np
​
# 读取数据集
train_data = pd.read_csv('用户新增预测挑战赛公开数据/train.csv')
​
#对udmap进行onehot
def udmap_onethot(d):
    v = np.zeros(9)
    if d == 'unknown': 
        return v 
    d = eval(d)  
    for i in range(1, 10): 
        if 'key' + str(i) in d: 
            v[i-1] = d['key' + str(i)]   
    return v  
train_udmap_df = pd.DataFrame(np.vstack(train_data['udmap'].apply(udmap_onethot)))
​
train_udmap_df.columns = ['key' + str(i) for i in range(1, 10)]
​
#计算每个key对应的标签均值
mean_labels = np.mean(train_udmap_df,axis=1)
​
#绘制直方图
plt.hist(mean_labels,bins=20)
plt.title('Mean Labels Distribution')
plt.xlabel('Mean Labels')
plt.ylabel('Count')
plt.show()

条形图

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 读取数据集
train_data = pd.read_csv('用户新增预测挑战赛公开数据/train.csv')
​
#对udmap进行onehot
def udmap_onethot(d):
    v = np.zeros(9)
    if d == 'unknown': 
        return v 
    d = eval(d)  
    for i in range(1, 10): 
        if 'key' + str(i) in d: 
            v[i-1] = d['key' + str(i)]   
    return v  
train_udmap_df = pd.DataFrame(np.vstack(train_data['udmap'].apply(udmap_onethot)))
train_udmap_df.columns = ['key' + str(i) for i in range(1, 10)]
​
​
# 计算每个key对应的标签均值
mean_dict = {}
for key, value in train_udmap_df.items():
    mean = np.mean(value)
    mean_dict[key] = mean
​
# 设置x和y的数据
x = list(mean_dict.keys())
y = list(mean_dict.values())
​
# 绘制条形图
plt.bar(x,y)
plt.xlabel('Key')
plt.ylabel('Mean value')
plt.title('Mean value of labels for each key')
plt.show()
  • DecisionTreeClassifier效果更好
  • 加入特征工程后模型精度更优

🐋二、机器学习中.columns

在机器学习中,.columns是Pandas库中DataFrame对象的一个属性,可用于获取数据集的列名列表。DataFrame是一个二维数据结构,类似于表格,具有行和列的索引。

通过.columns属性,我们可以查看数据集中所有列的名称。以下是一个示例代码:

import pandas as pd

# 读取数据
data = pd.read_csv('data.csv')

# 获取所有列的名称
columns_list = data.columns

# 打印列名
print(columns_list)

上述代码中,假设数据集保存在名为"data.csv"的文件中。通过data.columns,我们可以获取数据集的所有列名,并将其存储在columns_list变量中。然后,我们可以通过打印输出columns_list来查看所有的列名。

.columns属性非常有用,因为它允许我们快速了解数据集的结构,查看数据集中包含哪些列或特征,以及根据需要选择特定的列进行相应的数据处理或建模操作。

🐋三、.dtype()的作用

在机器学习中,.dtype()是Pandas库中Series对象或DataFrame对象的一个方法,用于获取数据类型。它可以返回数据集中每个列的数据类型,也可以返回Series对象自身的数据类型。

以下是一些示例代码来展示.dtype()的使用:

import pandas as pd

# 创建一个Series对象
s = pd.Series([1, 2, 3, 4, 5])

# 获取Series对象的数据类型
s_dtype = s.dtype

# 打印数据类型
print(s_dtype)

在上述代码中,我们创建了一个包含整数的Series对象。然后,通过调用s.dtype方法,我们可以获取Series对象的数据类型,并将其存储在s_dtype变量中。最后,通过打印输出s_dtype,我们可以查看Series对象的数据类型,这里应该是int64

同样,我们也可以使用.dtype()方法来获取DataFrame对象中每个列的数据类型。以下是一个示例代码:

import pandas as pd

# 创建一个DataFrame对象
data = pd.DataFrame({'A': [1, 2, 3], 'B': ['a', 'b', 'c']})

# 获取DataFrame对象的每个列的数据类型
data_dtypes = data.dtypes

# 打印每个列的数据类型
print(data_dtypes)

在上述代码中,我们创建了一个包含两个列的DataFrame对象。通过调用data.dtypes方法,我们可以获取DataFrame对象中每个列的数据类型,并将其存储在data_dtypes变量中。最后,通过打印输出data_dtypes,我们可以查看每个列的数据类型。

.dtype()方法对于数据的探索、数据预处理和特征工程等环节都非常有用。通过了解数据类型,我们可以确保数据的正确处理和转换,以及选择合适的方法和工具来处理不同类型的数据。

🐋四、.unique()的作用

在机器学习中,.unique()是Pandas库中Series对象的一个方法,用于获取Series对象中所有唯一的值。它返回一个包含唯一值的numpy.ndarray数组。

以下是一些示例代码来展示.unique()的使用:

import pandas as pd

# 创建一个Series对象
s = pd.Series([1, 2, 3, 4, 2, 1, 3, 5])

# 获取Series对象中的唯一值
unique_values = s.unique()

# 打印唯一值
print(unique_values)

在上述代码中,我们创建了一个包含多个重复值的Series对象。然后,通过调用s.unique()方法,我们可以获取Series对象中所有唯一的值,并将其存储在unique_values变量中。最后,通过打印输出unique_values,我们可以查看所有的唯一值,这里应该是[1 2 3 4 5]

在实际的机器学习问题中,我们需要了解数据集中有哪些唯一的值,这对于处理分类变量和数据过滤都是很有帮助的。比如,在对分类变量进行预处理时,我们可能需要将其编码为数字或将其转换为虚拟变量,此时我们需要了解有哪些唯一的类别值,以便正确地进行处理和转换。在数据过滤时,我们可能需要根据特定的值来提取/删除行或列,此时我们也需要了解有哪些唯一值。因此,.unique()方法通常是一个有用的工具。

🐋五、DataFrame

DataFrame是Pandas库中的一个数据结构,类似于一个二维表格或Excel表格。它由行和列组成,每个列可以是不同的数据类型(例如整数、浮点数、字符串、布尔值等)。DataFrame提供了很多便于数据操作和分析的方法和函数。

DataFrame可以通过多种方式创建,比如从CSV文件、Excel文件、数据库查询结果等导入数据,或者手动创建一个字典、列表等数据结构转换为DataFrame。

DataFrame具有以下特点:

  • 可以对行和列进行标签索引,方便数据的访问和处理。
  • 可以进行数据过滤、排序、分组、合并和重塑等操作。
  • 可以进行数值计算、统计分析和数据可视化等。
  • 可以处理缺失值和异常值,并提供了灵活的数据处理工具。
  • 可以直接与其他数据分析库和工具进行整合,如NumPy、Matplotlib、Scikit-learn等。

总而言之,DataFrame是一个非常有用的数据结构,广泛应用于数据清洗、数据处理、特征工程和机器学习等领域。

🐋六、柱状图

hourly_counts.plot(kind='bar',stacked=True) 这行代码是利用Pandas库中的DataFrame对象的绘图函数,对一个名为hourly_counts的DataFrame进行绘图,并将其图形显示为堆积柱状图。具体含义如下:

  • kind='bar':表示绘制柱状图。
  • stacked=True:表示将数据堆积在一起显示。

通过这个命令,我们可以在同一个图形中可视化不同标签的计数随时间的变化情况。这个可视化方式很适合比较不同标签在不同时间段内的相对大小和趋势,同时也可以直观地看出整个数据集的总体趋势。

🐋七、特征工程

特征工程是机器学习和数据分析中至关重要的一步,它涉及到对原始数据进行处理、转换和创建新的特征,以提高模型性能和预测能力。下面是关于特征工程的一些常见知识点:

  1. 特征选择(Feature Selection):从原始特征集中选择最具有预测能力的一部分特征,以降低维度和减少噪声的影响。常用的特征选择方法包括相关性分析、方差阈值法、特征重要性排序等。

  2. 特征转换(Feature Transformation):通过数学变换来改变特征的表示形式,以更好地适应模型。常见的特征转换方法包括标准化、归一化、对数变换、多项式特征等。

  3. 特征生成(Feature Generation):基于已有的特征创建新的特征,通过对原始特征进行加减乘除、统计聚合等操作来丰富特征空间。常见的特征生成方法包括多项式特征、交叉特征、统计特征等。

  4. 缺失值处理(Missing Value Handling):处理数据中的缺失值,常见的方法有删除缺失值、填充缺失值(例如使用均值、中位数或其他合适的值进行填充)以及使用模型预测缺失值等。

  5. 异常值处理(Outlier Handling):检测和处理数据中的异常值,常见的方法有基于统计分析的方法(例如均值和标准差、箱线图等)和基于模型的方法(例如使用监督或无监督学习模型来检测异常值)。

  6. 数据编码(Data Encoding):将非数值型的特征转换为数值型,以便机器学习算法能够处理,常见的编码方法有独热编码、标签编码等。

  7. 特征缩放(Feature Scaling):将不同尺度范围的特征转换到相同的尺度范围,以便提高模型训练的效率和稳定性。常见的缩放方法有标准化、归一化等。

  8. 时间特征处理(Time Feature Handling):针对时间序列数据,提取时间的不同维度信息(例如年、月、日、小时等)作为特征,以捕捉时间的周期性和趋势。

特征工程的选择和应用需要根据具体的问题和数据情况来决定,也需要不断尝试和调整,以获得最佳的特征表示和性能提升。

  • 特征选择

特征选择是指从原始特征集中选择一部分最具有预测能力的特征,以提高模型的性能和泛化能力。以下是特征选择的一些常见方法和技巧:

  1. 相关性分析:通过计算特征与目标变量之间的相关性,选择与目标变量高度相关的特征。常用的相关性分析方法有皮尔逊相关系数和斯皮尔曼等级相关系数。

  2. 方差阈值法:通过计算特征的方差,选择方差大于设定阈值的特征。这种方法适用于二元特征或离散特征。

  3. 特征重要性排序:通过训练模型(例如决策树、随机森林等)并利用特征的重要性指标(例如基尼系数、信息增益等)对特征进行排序,选择排名靠前的特征。

  4. 正则化方法:在线性模型中,通过对目标函数添加正则化项(例如L1正则化或L2正则化)来约束特征的权重,从而实现特征选择。

  5. 基于特征子集搜索的方法:通过穷举或启发式算法搜索所有可能的特征子集,并评估每个子集的性能,选择性能最优的特征子集。常见的搜索算法有贪婪搜索、遗传算法和递归特征消除(Recursive Feature Elimination)等。

  6. 基于模型的方法:利用机器学习模型的内在特性选择特征,例如使用决策树模型的前N个分裂特征、使用稳定回归系数的特征等。

  7. 基于稀疏模型的方法:通过使用稀疏学习模型(例如L1正则化的线性模型和Lasso回归)来实现自动特征选择。

特征选择的关键是在保持或提高模型性能的同时减少特征集的维度和噪声的影响。选择适合数据和问题性质的特征选择方法,并进行适当的调整和验证,可以提高模型的泛化能力、降低过拟合风险,并减少计算成本和存储需求。 下面给出一个使用皮尔逊相关系数进行特征选择的代码示例:

import pandas as pd
import numpy as np
from scipy.stats import pearsonr

# 读取数据
data = pd.read_csv('data.csv')

# 分离特征和目标变量
X = data.drop('target', axis=1)
y = data['target']

# 计算特征与目标变量的相关系数
correlation = []
for feature in X.columns:
    corr, _ = pearsonr(X[feature], y)
    correlation.append((feature, abs(corr)))

# 按相关系数的绝对值大小对特征进行排序
correlation.sort(key=lambda x: x[1], reverse=True)

# 选择相关系数最大的前N个特征
selected_features = [x[0] for x in correlation[:10]] # 选择前10个特征

# 输出选中的特征
print("Selected Features:", selected_features)

上述代码中,首先导入所需的包,然后读取数据。接下来,将数据分为特征(X)和目标变量(y)两部分。然后,遍历每个特征,使用pearsonr函数计算该特征与目标变量的相关系数。相关系数的绝对值越大,表示该特征对目标变量的影响越大。将特征及其相关系数存储在correlation列表中。最后,根据相关系数的绝对值大小对特征进行排序,并选择相关系数最大的前N个特征进行选取。

需要注意的是,上述代码仅展示了皮尔逊相关系数的特征选择方法,其他特征选择方法的实现方式略有不同。具体的特征选择方法和代码实现需要根据问题和数据的特性选择合适的方法,并进行适当的调整。

  • 特征转换

特征转换是指对原始特征进行变换或组合,生成新的特征以提取更多有用的信息或改善特征的表示能力。以下是几种常见的特征转换方法和相应的代码示例:

  1. 标准化/归一化:

标准化(Standardization)和归一化(Normalization)是常用的特征转换方法,旨在将特征的数值范围映射到某个特定的范围,并消除数值差异。常用的标准化方法有Z-score标准化和最小-最大归一化。

from sklearn.preprocessing import StandardScaler, MinMaxScaler

# 标准化(Z-score标准化)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 归一化(最小-最大归一化)
scaler = MinMaxScaler()
X_normalized = scaler.fit_transform(X)
  1. 多项式特征:

多项式特征是将特征的幂次相互组合而生成的新特征。这种特征转换能够增加模型的非线性能力。

from sklearn.preprocessing import PolynomialFeatures

# 生成二次多项式特征
poly = PolynomialFeatures(degree=2)
X_poly = poly.fit_transform(X)
  1. 对数变换:

对数变换可以将原始特征按照对数函数进行转换,常用于处理具有指数增长趋势的特征。

import numpy as np

# 对特征进行对数变换
X_log = np.log1p(X)
  1. 单位化变换:

单位化变换将向量特征转换为单位向量,常用于文本特征的向量化表示。

from sklearn.preprocessing import Normalizer

# 单位化
normalizer = Normalizer()
X_normalized = normalizer.fit_transform(X)
  1. 特征编码:

特征编码是将非数值型特征转换为数值型特征。常用的编码方法有独热编码和标签编码。

from sklearn.preprocessing import OneHotEncoder, LabelEncoder

# 独热编码
encoder = OneHotEncoder()
X_encoded = encoder.fit_transform(X)

# 标签编码
encoder = LabelEncoder()
X_encoded = encoder.fit_transform(X)

特征转换的具体方法和技巧取决于数据的特性和问题的需求。需要根据实际情况选择合适的特征转换方法,并进行适当的调整和验证,以提高模型的性能和泛化能力。

  • 缺失值处理

缺失值处理是指针对数据中出现的缺失值(含NaN、None等)进行处理的过程,以保证数据的完整性和准确性。下面是几种常见的缺失值处理方法和相应的代码示例:

  1. 删除含有缺失值的样本或特征:

删除含有缺失值的样本或特征是缺失值处理中最简单和常用的方法之一,适用于缺失值较少的情况。

# 删除含有缺失值的样本
data.dropna(inplace=True)

# 删除含有缺失值的特征
data.dropna(axis=1, inplace=True)
  1. 填补缺失值:

填补缺失值是常见的缺失值处理方法之一,它通过一些策略来用合适的值替代缺失值。

import pandas as pd

# 均值填补
data['feature'].fillna(data['feature'].mean(), inplace=True)

# 中位数填补
data['feature'].fillna(data['feature'].median(), inplace=True)

# 众数填补
data['feature'].fillna(data['feature'].mode()[0], inplace=True)
  1. 插值法:

插值法是一种通过对已知数据进行推断来填补缺失值的方法,它在时间序列或空间分布上进行插值推断。

from scipy.interpolate import InterpolatedUnivariateSpline

# 线性插值
data['feature'].interpolate(method='linear', inplace=True)

# Spline插值
spline = InterpolatedUnivariateSpline(data.index, data['feature'])
data['feature'] = spline(data.index)
  1. 使用模型预测:

使用已知特征值拟合一个模型,然后使用该模型进行缺失值的预测,常用于缺失值较多或缺失值模式不规则的情况。

from sklearn.ensemble import RandomForestRegressor

# 构建训练集和测试集
train_data = data.loc[~data['feature'].isnull()]
test_data = data.loc[data['feature'].isnull()]

# 拟合模型进行预测
model = RandomForestRegressor()
model.fit(train_data.drop('feature', axis=1), train_data['feature'])
predicted_values = model.predict(test_data.drop('feature', axis=1))

# 填补预测值
data.loc[data['feature'].isnull(), 'feature'] = predicted_values

缺失值处理方法的选择需要根据数据的特性、缺失值的分布和问题的需求进行决策。不同的方法可能适用于不同的情况,需要进行合适的调整和验证,以保证数据的质量和分析结果的准确性。

  • 异常值处理

异常值处理是指对数据中的异常值进行识别、处理或剔除的过程,以保证数据的准确性和可靠性。下面是几种常见的异常值处理方法和相应的代码示例:

  1. 可视化方法:

可视化方法通过绘制数据分布的图形来观察异常值的存在与否,常用的可视化技巧包括盒图、散点图等。

import matplotlib.pyplot as plt

# 绘制盒图
plt.boxplot(data['feature'])
plt.show()

# 绘制散点图
plt.scatter(data['feature1'], data['feature2'])
plt.show()
  1. 基于统计方法的离群值检测:

基于统计方法的离群值检测使用统计指标(如均值、标准差等)来判断数据是否为异常值。

import numpy as np

# 计算均值和标准差
mean = np.mean(data['feature'])
std = np.std(data['feature'])

# 根据均值和标准差判断是否为异常值
threshold = 3
outliers = data[data['feature'] > mean + threshold * std]
  1. 基于距离的离群值检测:

基于距离的离群值检测使用样本点与其他样本点之间的距离判断数据是否为异常值,常用的方法有K近邻和LOF(局部离群因子)。

from sklearn.neighbors import LocalOutlierFactor

# 使用LOF检测离群值
clf = LocalOutlierFactor()
outliers = clf.fit_predict(data)
  1. 基于聚类的离群值检测:

基于聚类的离群值检测将数据点划分为多个聚类簇,并通过计算数据点到聚类中心的距离来判断数据是否为异常值,常用的方法有DBSCAN和孤立森林。

from sklearn.cluster import DBSCAN

# 使用DBSCAN检测离群值
dbscan = DBSCAN(eps=0.3, min_samples=10)
outliers = dbscan.fit_predict(data)
  1. 使用模型预测:

使用已知特征值拟合一个模型,然后使用该模型预测数据,将与真实值差异较大的样本点视为异常值。

from sklearn.ensemble import IsolationForest

# 构建训练集
train_data = data.dropna()

# 拟合模型进行预测
model = IsolationForest()
model.fit(train_data.drop('feature', axis=1))
predicted_values = model.predict(data.drop('feature', axis=1))

# 提取异常值
outliers = data[predicted_values == -1]

异常值处理方法的选择需要根据异常值的特性、数据的分布和问题的需求进行决策。不同的方法可能适用于不同的情况,需要进行适当的调整和验证,以保证数据的可靠性和分析结果的准确性。