2023年第2回DingTalk杯大学生ビッグデータチャレンジ予選A:スマートフォンユーザー監視データ分析問題 二項分類・回帰問題 Pythonコード分析

2023年第2回DingTalk杯大学生ビッグデータチャレンジ予選A:スマートフォンユーザー監視データ分析問題 二項分類・回帰問題 Pythonコード分析

ここに画像の説明を挿入

関連リンク

【2023年第2回鼎鼎杯大学生ビッグデータチャレンジ予選】予選A:スマートフォンユーザー監視データ分析問題 - Pythonコード分析

【2023年第2回鼎鼎杯大学生ビッグデータチャレンジ予選】予選A:スマートフォンユーザー監視データ分析問題のPythonコード分析二項分類と回帰問題

1 件のトピック

2023年第2回DingTalk杯大学生ビッグデータチャレンジ予選テーマ予選A:スマートフォンユーザーモニタリングデータ分析

1. 問題の背景

近年、スマートフォンの登場によりその人気は爆発的に高まり、中国のスマートフォン市場の発展と拡大を促進するだけでなく、携帯電話ソフトウェアの開発も急速に促進されています。近年、中国のスマートフォン市場におけるブランド競争はさらに激化し、中国は米国を抜き世界最大のスマートフォン市場となった。携帯電話のソフトウェアは日々変化し、人々は携帯電話をより快適に使用し、人々の生活に多くの楽しみをもたらすとともに、新たな「頭を下げる人々」のグループも生み出しています。モバイル ソフトウェアは人々の生活に入り込み、ゲーム、ショッピング、ソーシャル ネットワーキング、情報、財務管理などのアプリが現代社会の人々を魅了し、便利にしており、携帯電話は人々の外出の必需品となっています。このデータは、ある企業の 40,000 人を超えるスマートフォン ユーザーの、ある年の連続 30 日間の監視データから得られたもので、感度を下げてデータ変換されています。日次データは合計 10 列の txt ファイルで、各 APP (appid で識別) の毎日の各ユーザー (uid で識別) の開始時刻、使用時間、上り下りトラフィックを記録します。詳細については、表 1 を参照してください。さらに、2 つの列を持つ補助テーブル app_class.csv があります。最初の列は appid で、ソーシャル、映画とテレビ、教育など、英語の文字で表される 4,000 以上の一般的に使用される APP カテゴリ (app_class) を示します。合計 20 の一般的に使用されるカテゴリ、残りのこのアプリは一般的に使用されていないため、カテゴリは不明です。

表1

変数 変数名 言い換える
1 UID ユーザーID
2 アプリケーション APP の ID (app_class ファイルの最初の列に対応)
3 アプリの種類 APP タイプ: 組み込みシステム、ユーザーによってインストールされる
4 開始日 使用開始日。値は 1 ~ 30 です (注: 初日のデータの最初の 2 行の使用開始日は 0 であり、この日の前日から使用されることを示します)
5 始まる時間 使用開始時刻
6 終了日 使用終了日
7 終了時間 終了時刻を使用する
8 間隔 使用時間(秒)
9 アップフロー アップストリームトラフィック
10 ダウンフロー ダウンストリームトラフィック

2、問題を解決する

  1. クラスター分析

(1) ユーザーがよく属する 20 種類の APP カテゴリのデータに従ってユーザーをクラスタリングする 比較のために少なくとも 3 つの異なるクラスタリング アルゴリズムを与え、適切なクラスタリング数 K 値を選択し、クラスタリング結果を分析する必要があります。

(2) クラスタリングの結果に従って、さまざまなカテゴリのユーザーをプロファイリングし、さまざまなユーザー グループの特性を分析します。(ユーザーポートレートの定義: 異なるグループのユーザーに異なるカテゴリーのAPP製品を推奨するために、属性、好み、行動習慣、その他の情報に従ってユーザーにラベルを付け、異なるグループのユーザーの行動を説明します。)

  1. APP使用状況の予測分析: 研究対象となる問題は、ユーザーのAPP使用記録に基づいて、ユーザーが将来そのAPPを使用するかどうか(分類問題)と使用期間(回帰問題)を予測することです。

(1)ユーザのAPPの使用を予測し、11日目のカテゴリaのAPPのユーザの使用に基づいて、12日目から21日目までにこのタイプのAPPを使用するかどうかを予測する。実際の結果と比較した予測結果の正解率を示します。(注: テスト セットはトレーニングと検証に参加できません。参加しない場合は違反として扱われます)

(2) ユーザーによるアプリの使用状況を予測し、ユーザーによるカテゴリa APPの1日から21日までの使用量に基づいて、12日目から21日目までのユーザーによるカテゴリa APPの使用の1日の有効平均使用時間を予測します。 11日目。評価指標はMMSEです。
MMSE = ∑ ( yi − yi ^ ) ∑ ( yi − yi ‾ ) MMSE = \sqrt{\frac{\sum(y_i-\hat{y_i})}{\sum(y_i-\overline{y_i})}}MMSE=( y私はy私は)( y私はy私は^)

式中, y i y_i y私は使用期間の実際の値を示します; yi ^ \hat{y_i}y私は^使用時間の予測値を示します; yi ‾ \overline{y_i}y私は全ユーザーの実利用時間の平均を示します。予測結果と実際の結果の間の NMSE を示します。(注: テスト セットはトレーニングと検証に参加できません。参加しない場合は違反として扱われます)

data.csv データは、ある企業の 40,000 人を超えるスマートフォン ユーザーの、ある年における連続 30 日間の監視データから取得されており、テーブル形式は次のとおりです。XGBoost モデルを使用して、12 日から 11 日までを予測してください。 1 日目から 11 日目までのユーザーのカテゴリー a アプリの使用状況 ユーザーによるカテゴリー a アプリの 21 日間の 1 日あたりの有効平均使用時間。評価指標はMMSEです。

変数 変数名 言い換える
1 UID ユーザーID
2 カテゴリー APPのカテゴリ(カテゴリa~z、全26カテゴリ)
3 アプリの種類 APP タイプ: 組み込みシステム、ユーザーによってインストールされる
4 開始日 使用開始日。値は 1 ~ 30 です (注: 初日のデータの最初の 2 行の使用開始日は 0 であり、この日の前日から使用されることを示します)
5 始まる時間 使用開始時刻
6 終了日 使用終了日
7 終了時間 終了時刻を使用する
8 間隔 使用時間(秒)
9 アップフロー アップストリームトラフィック
10 ダウンフロー ダウンストリームトラフィック

2 モデリングのアイデア

最初の質問:

  1. データ前処理: ユーザーがよく使用する 20 種類の APP データに対してデータ クリーニングと特徴抽出を実行します。PCA および LDA アルゴリズムを次元削減に使用して、計算の複雑さを軽減できます。

  2. クラスタリング アルゴリズム:
    a. K 平均法: データ クラスタリングを実行する場合、複数の実験に対して異なる K 値を選択し、最適なクラスタリング結果を選択します。シルエット係数やカリンスキー・ハラバズ指数などの評価指標を比較・選択することができます。
    b. DBSCAN: 事前にクラスター数を指定せずに、密度を使用してデータ ポイントをクラスター化します。密度ベースのクラスタリング アルゴリズムを使用する場合、半径パラメータと密度パラメータを調整することで、さまざまなクラスタリング効果を得ることができます。
    c. 階層的クラスタリング: トップダウン方式とボトムアップ方式に分けられます。各データ点間の類似度を繰り返し計算することにより、データ点が徐々にマージされ、最終的にクラスタリング結果が得られます。

    d. クラスタリングアルゴリズムの改善

    e. ディープクラスタリングアルゴリズム

  3. クラスタリング結果の分析: 最適なクラスタリング結果を選択した後、さまざまなカテゴリのユーザーをプロファイリングします。各カテゴリのユーザーの行動特性 (使用時間、使用頻度、使用期間、好みなど) を分析し、ユーザーのポートレートに基づいてユーザーにラベルを付けます。ユーザーのタグに従って、さまざまなカテゴリのAPP製品を推奨します。

2 番目の質問:

  1. データ前処理: ユーザーによる各 APP の使用回数や使用期間のカウントなど、ユーザー APP 使用記録データに対してデータ クリーニングと特徴抽出を実行します。
  2. 分類問題の予測: 分類モデルを確立し、ユーザーの 1 ~ 11 日間の APP 使用記録を使用し、特徴量エンジニアリングを使用してデータを処理し、デシジョン ツリー、ランダム フォレスト、サポート ベクターなどのトレーニングとテストに適切な分類アルゴリズムを選択します。マシン、改善された機械学習分類アルゴリズム。最後に、テスト セットを使用してモデルを検証し、モデルの精度を評価します。
  3. 回帰問題の予測: 回帰モデルを確立し、1 ~ 11 日間のユーザーの APP 使用記録を使用し、特徴量エンジニアリングを使用してデータを処理し、線形回帰、デシジョン ツリー回帰、トレーニングおよびテストに適切な回帰アルゴリズムを選択します。ニューラルネットワークの回帰。テスト セットを使用してモデルを検証し、モデルの精度を評価します。NMSE 評価インデックスを使用できます。

3 問題 1 実装コード

【2023年第2回鼎鼎杯大学生ビッグデータチャレンジ予選】予選A:スマートフォンユーザー監視データ分析問題 - Pythonコード分析

4 質問 2 実装コード

4.1 分類問題: カテゴリ APP を使用するかどうかを予測する

(1) 特徴量エンジニアリングの部分については、質問 1 のブログを参照してください。

【2023年第2回鼎鼎杯大学生ビッグデータチャレンジ予選】予選A:スマートフォンユーザー監視データ分析問題 - Pythonコード分析

(2) データの読み込み

1 ~ 11 日のデータはトレーニング セットとして使用され、12 ~ 21 日のデータはテスト セットとして使用されます。

分類を作成します。ユーザーには複数の使用状況レコードがあることに注意してください。テスト セットでは、予測する前にユーザー ID に従って重複を排除する必要があります。

import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
import warnings
warnings.filterwarnings("ignore")

# 读取全部数据集
# 读取训练集
train_folder_path = '初赛数据集/训练集'
train_dfs = []
for filename in os.listdir(train_folder_path):
    if filename.endswith('.txt'):
        csv_path = os.path.join(train_folder_path, filename)
        tempdf = pd.read_csv(csv_path)
        train_dfs.append(tempdf)
train_df = pd.concat(train_dfs,axis=0)
# 读取测试集
test_folder_path = '初赛数据集/测试集'
test_dfs = []
for filename in os.listdir(test_folder_path):
    if filename.endswith('.txt'):
        csv_path = os.path.join(test_folder_path, filename)
        tempdf = pd.read_csv(csv_path)
        test_dfs.append(tempdf)
test_df = pd.concat(test_dfs,axis=0)
# 提取特征和标签
X_train = train_df.drop(['category','uid','appid'], axis=1)
y_train = train_df['category']

X_test = test_df.drop(['category','uid','appid'], axis=1)
y_test = test_df['category']

(3) モデルのトレーニング

# 训练决策树模型
dt_model = DecisionTreeClassifier(random_state=42)
dt_model.fit(X_train, y_train)
dt_y_pred = dt_model.predict(X_test)
dt_accuracy = accuracy_score(y_test, dt_y_pred)
print('决策树模型的准确率:', dt_accuracy)

デシジョン ツリー モデルの精度: 0.8853211009174312


# 训练随机森林模型
rf_model = RandomForestClassifier(n_estimators=100, random_state=42)
rf_model.fit(X_train, y_train)
rf_y_pred = rf_model.predict(X_test)
rf_accuracy = accuracy_score(y_test, rf_y_pred)
print('随机森林模型的准确率:', rf_accuracy)

ランダムフォレストモデルの精度: 0.9724770642201835

# 训练支持向量机模型
svc_model = SVC(kernel='linear')
svc_model.fit(X_train, y_train)
svc_y_pred = svc_model.predict(X_test)
svc_accuracy = accuracy_score(y_test, svc_y_pred)

print('支持向量机模型的准确率:', svc_accuracy)

SVM モデルの精度: 0.9513251783893986

4.2 回帰問題

(1) 特徴抽出部

  • 過去11日間の毎日の時間機能、日、時、分、休日、週末、営業日などの時間機能も追加できます
  • 過去 11 日間のカテゴリ a アプリのユーザーの合計使用時間
  • ユーザーが過去 11 日間にカテゴリ a のアプリを使用した回数
  • 過去 11 日間のカテゴリー a アプリのユーザー数の曲線傾向
  • カテゴリ A のアプリに関連するその他の特徴

読み取りデータ


import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
from sklearn.preprocessing import StandardScaler
import holidays
import os

# 加载 APP 类别文件
app_class = pd.read_csv('初赛数据集/app_class.csv',names=['appid','app_type'])
app_type_dict = dict(zip(app_class['appid'], app_class['app_type']))

# 读取训练集,该文件夹下面包括day01.txt到day21.txt,总共21个文件
train_folder_path = '初赛数据集/问题2数据集'
train_dfs = []
cols = ['uid','appid','app_type','start_day','start_time','end_day','end_time','duration','up_flow','down_flow']
for filename in os.listdir(train_folder_path):
    if filename.endswith('.txt'):
        csv_path = os.path.join(train_folder_path, filename)
        tempdf = pd.read_csv(csv_path,names=cols)
        train_dfs.append(tempdf)
data = pd.concat(train_dfs,axis=0)
data.shape

データの前処理

# 处理app类别
data['category'] = data['appid'].map(app_type_dict)
# 处理时间格式
data['start_time'] = pd.to_datetime(data['start_time'])
data['end_time'] = pd.to_datetime(data['end_time'])

# 构建"使用时长(小时)"特征
data['duration_hour'] = (data['end_time'] - data['start_time']).dt.seconds / 3600
# 缺失值处理
data = data.dropna()

# 提取时间特征
data['start_time_day'] = data.start_time.dt.day
data['start_time_hour'] = data.start_time.dt.hour
data['start_time_minute'] = data.start_time.dt.minute


# 异常值处理(例如使用时长小于0或大于24小时的数据)
data = data[(data['duration_hour'] >= 0) & (data['duration_hour'] <= 24)]

# 构建训练集和测试集
train = data[data['start_day'] <= 11]
test = data[(data['start_day'] >= 12) & (data['start_day'] <= 21)]

特徴エンジニアリング

# 提取过去11天用户对a类APP的总使用时长
。。。略
# 提取过去11天用户对a类APP的使用次数
。。。略


# 将特征合并到训练集和测试集中
train = pd.merge(train, total_duration, on='uid', how='left')
train = pd.merge(train, count, on='uid', how='left')

test = pd.merge(test, total_duration, on='uid', how='left')
test = pd.merge(test, count, on='uid', how='left')


# 缺失值处理
train = train.fillna(0)
test = test.fillna(0)

# 选择必要的特征
features = ['a_total_duration', 'a_count','start_time_day','start_time_hour','start_time_minute']
# 构建训练集和测试集的特征矩阵和目标变量
。。。略


X_test = test[features].values
mean_test_duration = test.groupby('uid')['duration_hour'].mean()
y_test = test['uid'].map(dict(mean_test_duration))

(2) モデルトレーニング部

XGB 回帰モデルを使用すると、LGB、線形回帰、決定木回帰、ニューラル ネットワーク回帰などのモデルも使用でき、パラメータを調整する必要があり、機械学習手法ではグリッド最適化の手法を考慮できます。


import xgboost as xgb
from sklearn.model_selection import GridSearchCV


# 特征归一化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.fit_transform(X_test)

# XGBoost回归模型,还可以使用线性回归、决策树回归、神经网络回归
xgbmodel = xgb.XGBRegressor(
            objective='reg:squarederror',
            n_jobs=-1,
            n_estimators=1000,
            max_depth=7,
            subsample=0.8,
            learning_rate=0.05,
            gamma=0,
            colsample_bytree=0.9,
            random_state=2021, max_features=None, alpha=0.3)

# 训练模型
xgbmodel.fit(X_train, y_train)

ここに画像の説明を挿入

(3) モデルの評価
標記の式に従って実現すると、式は次のようになります。
MMSE = ∑ ( yi − yi ^ ) ∑ ( yi − yi ‾ ) MMSE = \sqrt{\frac{\sum(y_i-\) hat{y_i})} {\sum(y_i-\overline{y_i})}}MMSE=( y私はy私は)( y私はy私は^)


from sklearn.metrics import mean_squared_error, mean_absolute_error

def MMSE(y_test, y_pred):
    # 计算实际值与预测值之间的平均误差
    error = y_test - y_pred
    # 计算分子和分母
    numerator = np.sum(np.square(error))
    denominator = np.sum(np.square(y_test - np.mean(y_test)))
    # 计算 MMSE
    mmse = np.sqrt(numerator / denominator)
    return mmse
# 对测试集进行预测
y_pred = xgbmodel.predict(X_test)

# 计算评价指标
mse = mean_squared_error(y_test, y_pred)
mae = mean_absolute_error(y_test, y_pred)
mmse = MMSE(y_test, y_pred)
print("MMSE: {:.4f},MSE: {:.4f}, MAE: {:.4f}".format(mmse,mse, mae))

MMSE: 1.0709、MSE: 0.0432、MAE: 0.1181

4 ダウンロード

Zhihu の記事の下部を参照してください。ダウンロード後、すべての質問の完全なコードが含まれています。

zhuanlan.zhihu.com/p/643785015

おすすめ

転載: blog.csdn.net/weixin_43935696/article/details/131895788