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) ユーザーがよく属する 20 種類の APP カテゴリのデータに従ってユーザーをクラスタリングする 比較のために少なくとも 3 つの異なるクラスタリング アルゴリズムを与え、適切なクラスタリング数 K 値を選択し、クラスタリング結果を分析する必要があります。
(2) クラスタリングの結果に従って、さまざまなカテゴリのユーザーをプロファイリングし、さまざまなユーザー グループの特性を分析します。(ユーザーポートレートの定義: 異なるグループのユーザーに異なるカテゴリーのAPP製品を推奨するために、属性、好み、行動習慣、その他の情報に従ってユーザーにラベルを付け、異なるグループのユーザーの行動を説明します。)
- 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 モデリングのアイデア
最初の質問:
-
データ前処理: ユーザーがよく使用する 20 種類の APP データに対してデータ クリーニングと特徴抽出を実行します。PCA および LDA アルゴリズムを次元削減に使用して、計算の複雑さを軽減できます。
-
クラスタリング アルゴリズム:
a. K 平均法: データ クラスタリングを実行する場合、複数の実験に対して異なる K 値を選択し、最適なクラスタリング結果を選択します。シルエット係数やカリンスキー・ハラバズ指数などの評価指標を比較・選択することができます。
b. DBSCAN: 事前にクラスター数を指定せずに、密度を使用してデータ ポイントをクラスター化します。密度ベースのクラスタリング アルゴリズムを使用する場合、半径パラメータと密度パラメータを調整することで、さまざまなクラスタリング効果を得ることができます。
c. 階層的クラスタリング: トップダウン方式とボトムアップ方式に分けられます。各データ点間の類似度を繰り返し計算することにより、データ点が徐々にマージされ、最終的にクラスタリング結果が得られます。d. クラスタリングアルゴリズムの改善
e. ディープクラスタリングアルゴリズム
-
クラスタリング結果の分析: 最適なクラスタリング結果を選択した後、さまざまなカテゴリのユーザーをプロファイリングします。各カテゴリのユーザーの行動特性 (使用時間、使用頻度、使用期間、好みなど) を分析し、ユーザーのポートレートに基づいてユーザーにラベルを付けます。ユーザーのタグに従って、さまざまなカテゴリのAPP製品を推奨します。
2 番目の質問:
- データ前処理: ユーザーによる各 APP の使用回数や使用期間のカウントなど、ユーザー APP 使用記録データに対してデータ クリーニングと特徴抽出を実行します。
- 分類問題の予測: 分類モデルを確立し、ユーザーの 1 ~ 11 日間の APP 使用記録を使用し、特徴量エンジニアリングを使用してデータを処理し、デシジョン ツリー、ランダム フォレスト、サポート ベクターなどのトレーニングとテストに適切な分類アルゴリズムを選択します。マシン、改善された機械学習分類アルゴリズム。最後に、テスト セットを使用してモデルを検証し、モデルの精度を評価します。
- 回帰問題の予測: 回帰モデルを確立し、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