前の投稿では、PCComponentes で Web スクレイピングを実行し、ラップトップ データを含む CSV を生成するスクリプトを作成しました。
このアイデアは、提供するコンポーネントに応じてデバイスの価格を予測する機械学習モデルを作成しようとしたときに生まれました。しかし、調査中にモデルのトレーニングに使用できる公開データフレームを見つけましたが、問題がありました。価格が 2015 年に遡り、ほとんど役に立ちませんでした。
このため、更新された信頼性の高いデータを取得できるように、PCComponentes Web サイトから直接 DataFrame を構築することにしました。さらに、このプロセスは将来的には自動化される可能性があります (少なくとも PCComponentes が Web サイトの構造を変更するまで)。
それでは始めましょう!
モデルをトレーニングする前に、読みやすく処理しやすいようにデータを整理して整理する必要があります。このために、データ分析と処理で広く使用されている Numpy、Pandas、および Matplotlib ライブラリを使用します。
最初に、これらのライブラリをインポートし、生成された CSV を開きます。
import pandas as pd import numpy as np import matplotlib.pyplot as plt
次に、空または null 値を含む行を削除します。
df = df.dropna()
利用可能なさまざまな種類の CPU を分析することから始めましょう。それらを表示するには、Seaborn ライブラリを使用します。
import seaborn as sns sns.countplot(data=df, x='CPU')
ここでは、207 種類の CPU があることがわかります。これらすべての値を使用してモデルをトレーニングすると、無関係なデータが多くなり、パフォーマンスに影響を与えるノイズが生成されるため、問題が発生する可能性があります。
列全体を削除する代わりに、最も関連性の高い値をフィルターします:
def cpu_type_define(text): text = text.split(' ') if text[0] == 'intel': if 'i' in text[-1]: if text[-1].split('-')[0] == 'i3': return 'low gamma intel processor' return text[0]+' '+text[1]+' '+text[-1].split('-')[0] return 'low gamma intel processor' elif text[0] == 'amd': if text[1] == 'ryzen': if text[2] == '3': return 'low gamma amd processor' return text[0]+' '+text[1]+' '+text[2] return 'low gamma amd processor' elif 'm' in text[0]: return 'Mac Processor' else: return 'Other Processor' data['Cpu'] = data['Cpu'].apply(cpu_type_define) sns.histplot(data=data,x='Cpu') data['Cpu'].value_counts()
結果:
グラフィックス カード (GPU) でも同様のプロセスを実行し、データ内のノイズを避けるためにカテゴリの数を減らします。
def gpu_type_define(text): if 'rtx' in text: num = int(''.join([char for char in text if char.isdigit()])) if num == 4080 or num == 4090 or num == 3080: return 'Nvidia High gamma' elif num == 4070 or num == 3070 or num == 4060 or num == 2080: return 'Nivida medium gamma' elif num == 3050 or num == 3060 or num == 4050 or num == 2070: return 'Nvidia low gamma' else: return 'Other nvidia grafic card' elif 'radeon' in text: if 'rx' in text: return 'Amd High gamma' else: return 'Amd low Gamma' elif 'gpu' in text: return 'Apple integrated graphics' return text data['Gpu'] = data['Gpu'].apply(gpu_type_define) sns.histplot(data=data,x='Gpu') data['Gpu'].value_counts()
結果:
ストレージ データを簡素化するために、すべてのハード ドライブの合計容量を 1 つの値に結合します。
def fitler_ssd(text): two_discs = text.split('+') if len(two_discs) == 2: return int(''.join([char for char in two_discs[0] if char.isdigit()])) + int(''.join([char for char in two_discs[1] if char.isdigit()])) else: return int(''.join([char for char in text if char.isdigit()])) data['SSD'] = data['SSD'].str.replace('tb','000') data['SSD'] = data['SSD'].str.replace('gb','') data['SSD'] = data['SSD'].str.replace('emmc','') data['SSD'] = data['SSD'].str.replace('ssd','')
最後に、RAM 値をフィルタリングして数値のみを保持します。
import pandas as pd import numpy as np import matplotlib.pyplot as plt
モデルをトレーニングする前に、数値以外の列をアルゴリズムが解釈できるデータに変換する必要があります。このために、sklearn ライブラリの ColumnTransformer と OneHotEncoder を使用します。
df = df.dropna()
私はいくつかの機械学習アルゴリズムをテストし、決定係数 (R2 スコア) に従ってどれが最も効率的かを決定しました。結果は次のとおりです:
Modelo | R2 Score |
---|---|
Logistic Regression | -4086280.26 |
Random Forest | 0.8025 |
ExtraTreeRegressor | 0.7531 |
GradientBoostingRegressor | 0.8025 |
XGBRegressor | 0.7556 |
最良の結果は、R2 が 1 に近い Random Forest と GradientBoostingRegressor で得られました。
さらに改善するために、投票リグレッサーを使用してこれらのアルゴリズムを組み合わせ、R2 スコア 0.8085 を達成しました。
import seaborn as sns sns.countplot(data=df, x='CPU')
投票リグレッサーでトレーニングされたモデルが最も効率的でした。これで、これを Web アプリケーションに統合する準備が整いました。これについては、次の投稿で詳しく説明します。
プロジェクトへのリンク
以上がML を使用したラップトップの価格予測の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。