Yapay zeka özellikli BigQuery DataFrames paketini kullanarak yapılandırılmış ve yapılandırılmamış verilerden analizler elde etme

1. Genel Bakış

Bu laboratuvarda, Python'u kullanarak verilerden analiz elde etmek için BigQuery Studio'daki bir Python not defterinden BigQuery veri çerçevelerini kullanacaksınız. Yapılandırılmamış metin verilerini analiz etmek ve görselleştirmek için Google'ın üretken yapay zekasından yararlanın.

Herkese açık bir müşteri şikayeti veritabanını kategorize etmek ve özetlemek için bir Python not defteri oluşturacaksınız. Bu, herhangi bir yapılandırılmamış metin verisi üzerinde çalışacak şekilde uyarlanabilir.

Hedefler

Bu laboratuvarda, aşağıdaki görevleri nasıl gerçekleştireceğinizi öğreneceksiniz:

  • BigQuery Studio'da Python not defterlerini etkinleştirme ve kullanma
  • BigQuery DataFrames paketini kullanarak BigQuery'ye bağlanma
  • BigQuery ML'yi ve Vertex AI'daki bir metin yerleştirme uç noktasına bağlantıyı kullanarak yapılandırılmamış metin verilerinden yerleştirmeler oluşturma
  • BigQuery ML'yi kullanarak küme yerleştirmeleri
  • BigQuery ML aracılığıyla kümeleri LLM ile özetleme

2. Şartlar

  • Chrome veya Firefox gibi bir tarayıcı
  • Faturalandırmanın etkin olduğu bir Google Cloud projesi

Başlamadan önce

Bu kod laboratuvarındaki talimatları uygulamak için BigQuery Studio'nun etkinleştirildiği ve bağlı bir faturalandırma hesabının bulunduğu bir Google Cloud projesine ihtiyacınız vardır.

  1. Google Cloud Console'daki proje seçici sayfasında bir Google Cloud projesi seçin veya oluşturun.
  2. Google Cloud projeniz için faturalandırmanın etkinleştirildiğinden emin olun. Projede faturalandırmanın etkin olup olmadığını nasıl kontrol edeceğinizi öğrenin.
  3. Öğe yönetimi için BigQuery Studio'yu etkinleştirme talimatlarını uygulayın.

BigQuery Studio'yu hazırlama

Boş bir not defteri oluşturup bir çalışma zamanına bağlayın.

  1. Google Cloud Console'da BigQuery Studio'ya gidin.
  2. + düğmesinin yanındaki simgesini tıklayın.
  3. Python not defteri'ni seçin.
  4. Şablon seçiciyi kapatın.
  5. Yeni bir kod hücresi oluşturmak için + Kod'u seçin.
  6. BigQuery DataFrames paketinin en son sürümünü kod hücresinden yükleyin.Aşağıdaki komutu yazın.
    %pip install --upgrade bigframes --quiet
    
    Kod hücresini çalıştırmak için 🞂 düğmesini tıklayın veya Üst Karakter + Enter tuşlarına basın.

3. Herkese açık veri kümesini okuma

Yeni bir kod hücresinde aşağıdakileri çalıştırarak BigQuery DataFrames paketini başlatın:

import bigframes.pandas as bpd

bpd.options.bigquery.ordering_mode = "partial"

Not: Bu eğitimde, deneysel "kısmi sıralama modunu" kullanıyoruz. Bu mod, pandas benzeri filtrelemeyle birlikte kullanıldığında daha verimli sorgulara olanak tanır. Sıkı bir sıralama veya dizin gerektiren bazı pandas özellikleri çalışmayabilir.

Tüketici Şikayeti Veritabanı

Tüketici Şikayeti Veritabanı, Google Cloud'un herkese açık veri kümesi programı aracılığıyla BigQuery'de sağlanır. Bu, tüketici finansal ürünleri ve hizmetleriyle ilgili şikayetlerin bir koleksiyonudur ve veriler Amerika Birleşik Devletleri Tüketici Finansal Koruma Bürosu tarafından toplanır.

Tüketici Şikayeti Veritabanı'nı analiz etmek için BigQuery'de bigquery-public-data.cfbp_complaints.complaint_database tablosunu sorgulayın. Sorgu dizesinden veya tablo kimliğinden DataFrame oluşturmak için bigframes.pandas.read_gbq() yöntemini kullanın.

"feedback" adlı bir DataFrame oluşturmak için yeni bir kod hücresinde aşağıdakileri çalıştırın:

feedback = bpd.read_gbq(
    "bigquery-public-data.cfpb_complaints.complaint_database"
)

Veri çerçevesi hakkında temel bilgileri keşfetme

Verilerin küçük bir örneğini indirmek için DataFrame.peek() yöntemini kullanın.

Bu hücreyi çalıştırın:

feedback.peek()

Beklenen çıkış:

  date_received                  product ... timely_response  consumer_disputed complaint_id  
0    2014-03-05  Bank account or service ...            True              False       743665   
1    2014-01-21  Bank account or service ...            True              False       678608   
2    2020-12-31          Debt collection ...            True               <NA>      4041190   
3    2014-02-12          Debt collection ...            True              False       714350   
4    2015-02-23          Debt collection ...            True              False      1251358   

Not: head(), sıralama gerektirir ve bir veri örneğini görselleştirmek istiyorsanız genellikle peek()'ten daha az etkilidir.

Pandas'da olduğu gibi, mevcut tüm sütunları ve bunlara karşılık gelen veri türlerini görmek için DataFrame.dtypes mülkünü kullanın. Bunlar pandas ile uyumlu bir şekilde gösterilir.

Bu hücreyi çalıştırın:

feedback.dtypes

Beklenen çıkış:

date_received                   date32[day][pyarrow]
product                              string[pyarrow]
subproduct                           string[pyarrow]
issue                                string[pyarrow]
subissue                             string[pyarrow]
consumer_complaint_narrative         string[pyarrow]
company_public_response              string[pyarrow]
company_name                         string[pyarrow]
state                                string[pyarrow]
zip_code                             string[pyarrow]
tags                                 string[pyarrow]
consumer_consent_provided            string[pyarrow]
submitted_via                        string[pyarrow]
date_sent_to_company            date32[day][pyarrow]
company_response_to_consumer         string[pyarrow]
timely_response                              boolean
consumer_disputed                            boolean
complaint_id                         string[pyarrow]
dtype: object

DataFrame.describe() yöntemi, DataFrame'den bazı temel istatistikleri sorgulayarak döndürür. Bu DataFrame sayısal sütun içermediğinden, boş olmayan değer sayısının ve farklı değerlerin sayısının bir özetini gösterir.

Bu hücreyi çalıştırın:

# Exclude some of the larger columns to make the query more efficient.
feedback.drop(columns=[
  "consumer_complaint_narrative",
  "company_public_response",
  "company_response_to_consumer",
]).describe()

Beklenen çıkış:

         product  subproduct    issue  subissue  company_name    state ... timely_response  consumer_disputed  complaint_id
count    3458906     3223615  3458906   2759004       3458906  3417792 ...         3458906             768399       3458906
nunique       18          76      165       221          6694       63 ...               2                  2       3458906

4. Verileri keşfetme

Gerçek şikayetleri incelemeye başlamadan önce, verileri görselleştirmek için DataFrame'deki pandas benzeri yöntemleri kullanın.

DataFrame'i görselleştirme

DataFrame.plot.hist() gibi çeşitli yerleşik görselleştirme yöntemleri vardır. Bu DataFrame çoğunlukla dize ve doğru/yanlış veriler içerdiğinden, çeşitli sütunlar hakkında daha fazla bilgi edinmek için önce bazı toplama işlemleri yapabiliriz.

Her eyaletten kaç şikayet alındığını sayın.

complaints_by_state = (
  feedback.groupby(
    "state", as_index=False,
  ).size()
  .rename(columns={"size": "total_complaints"})
  .sort_values(by="total_complaints", ascending=False)
)

DataFrame.to_pandas() yöntemini kullanarak bunu bir pandas DataFrame'e dönüştürün.

complaints_pd = complaints_by_state.head(10).to_pandas()

İndirilen bu DataFrame'de pandas görselleştirme yöntemlerini kullanın.

complaints_pd.plot.bar(x="state", y="total_complaints")

En çok şikayetin Kaliforniya&#39;dan geldiğini gösteren çubuk grafik

Diğer veri kümeleriyle birleştirme

Daha önce, şikayetleri eyalet bazında inceliyordunuz ancak bu yöntemde önemli bağlam bilgileri kayboluyordu. Bazı eyaletlerin nüfusu diğerlerinden daha fazladır. ABD Nüfus Bürosu'nun Amerikan Topluluk Anketi ve bigquery-public-data.geo_us_boundaries.states tablosu gibi bir nüfus veri kümesiyle birleştirin.

us_states = bpd.read_gbq("bigquery-public-data.geo_us_boundaries.states")
us_survey = bpd.read_gbq("bigquery-public-data.census_bureau_acs.state_2020_5yr")

# Ensure there are leading 0s on GEOIDs for consistency across tables.
us_states = us_states.assign(
    geo_id=us_states["geo_id"].str.pad(2, fillchar="0")
)

us_survey = us_survey.assign(
    geo_id=us_survey["geo_id"].str.pad(2, fillchar="0")
)

American Community Survey, eyaletleri GEOID'ye göre tanımlar. İki harfli eyalet koduna göre nüfusu almak için eyaletler tablosuyla birleştirin.

pops = us_states.set_index("geo_id")[["state"]].join(
  us_survey.set_index("geo_id")[["total_pop"]]
)

Artık nüfusu şikayet sayısıyla karşılaştırmak için bunu şikayet veritabanına ekleyin.

complaints_and_pops = complaints_by_state.set_index("state").join(
    pops.set_index("state")
)

Eyalet nüfuslarını şikayet sayısıyla karşılaştırmak için bir dağılım grafiği oluşturun.

(
  complaints_and_pops
  .to_pandas()
  .plot.scatter(x="total_pop", y="total_complaints")
)

Nüfusu şikayetlerle karşılaştıran bir dağılım grafiği

Nüfus ile şikayet sayısı karşılaştırıldığında birkaç eyalet anormal görünüyor. Bu noktaları tanımlamak için nokta etiketleriyle noktaları göstermek okuyucunun yapması gereken bir alıştırmadır. Benzer şekilde, bunun neden olabileceğine dair bazı hipotezler (ör. farklı demografi, farklı sayıda mali hizmet şirketi vb.) oluşturun ve bunları test edin.

5. Yerleştirilmiş öğeleri hesaplama

Önemli bilgiler genellikle metin, ses veya resim gibi yapılandırılmamış verilerde gizlidir. Bu örnekte, şikayet veritabanındaki yararlı bilgilerin çoğu şikayetin metin içeriğinde yer almaktadır.

Yapay zeka ve duyarlı analiz, "kelime çantası" ve word2vec gibi geleneksel teknikler, yapılandırılmamış verilerden bazı nicel bilgiler ayıklayabilir. Daha yakın zamanda, LLM'lerle yakından ilişkili olan "vektör yerleştirme" modelleri, metnin anlamsal bilgilerini temsil eden bir dizi kayan noktalı sayı oluşturabilir.

Veritabanının bir alt kümesini seçme

Bir vektör yerleştirme modelini çalıştırmak diğer işlemlere kıyasla daha fazla kaynak kullanır. Maliyetleri ve kota sorunlarını azaltmak için bu eğitimdeki geri kalan kısım için verilerin bir alt kümesini seçin.

import bigframes.pandas as bpd

bpd.options.bigquery.ordering_mode = "partial"

feedback = bpd.read_gbq(
    "bigquery-public-data.cfpb_complaints.complaint_database"
)

# Note: if not using ordering_mode = "partial", you must specify these in read_gbq
# for these to affect query efficiency.
# feedback = bpd.read_gbq(
#    "bigquery-public-data.cfpb_complaints.complaint_database",
#     columns=["consumer_complaint_narrative"],
#     filters= [
#         ("consumer_complaint_narrative", "!=", ""),
#         ("date_received", "==", "2022-12-01")])

feedback.shape

Toplam veritabanında yaklaşık 3,5 milyon satır olmasına karşılık 01.12.2022'de yaklaşık 1.000 şikayet gönderilmiştir (feedback.shape ile iletişime geçin).

Yalnızca 01.12.2022 tarihli verileri ve yalnızca consumer_complaint_narrative sütununu seçin.

import datetime

feedback = feedback[
    # Filter rows by passing in a boolean Series.
    (feedback["date_received"] == datetime.date(2022, 12, 1))
    & ~(feedback["date_received"].isnull())
    & ~(feedback["consumer_complaint_narrative"].isnull())
    & (feedback["consumer_complaint_narrative"] != "")
    & (feedback["state"] == "CA")

    # Uncomment the following if using free credits for a workshop.
    # Billing accounts with free credits have limited Vertex AI quota.
    # & (feedback["product"] == "Mortgage")
][
    # Filter columns by passing in a list of strings.
    ["consumer_complaint_narrative"]
]

feedback.shape

pandas'daki drop_duplicates yöntemi, eşleşen ilk veya son satırı seçip onunla ilişkili dizini korumaya çalıştığından satırların toplam sıralamasını gerektirir.

Bunun yerine, satırları tekilleştirmek için groupby yöntemini çağırarak toplayın.

feedback = (
  feedback.groupby("consumer_complaint_narrative", as_index=False)
  .size()
)[["consumer_complaint_narrative"]]

feedback.shape

Yerleştirilmiş öğeler oluşturma

BigQuery DataFrames, TextEmbeddingGenerator sınıfı aracılığıyla yerleştirme vektörleri oluşturur. Bu işlem, BigQuery ML'deki ML.GENERATE_EMBEDDING yöntemine dayanır. Bu yöntem, Vertex AI tarafından sağlanan metin yerleştirme modellerini çağırır.

from bigframes.ml.llm import TextEmbeddingGenerator

embedding_model = TextEmbeddingGenerator(
    model_name="text-embedding-004"
)
feedback_embeddings = embedding_model.predict(feedback)

Yerleşimlerin nasıl göründüğüne göz atın. Bu vektörler, metin yerleştirme modeli tarafından anlaşıldığı şekliyle metnin anlamsal anlamını temsil eder.

feedback_embeddings.peek()

Beklenen çıkış:

                        ml_generate_embedding_result  \
0  [ 7.36380890e-02  2.11779331e-03  2.54309829e-...   
1  [-1.10935252e-02 -5.53950183e-02  2.01338865e-...   
2  [-7.85628427e-03 -5.39347418e-02  4.51385677e-...   
3  [ 0.02013054 -0.0224789  -0.00164843  0.011354...   
4  [-1.51684484e-03 -5.02693094e-03  1.72322839e-...   

Bu vektörlerin birçok boyutu vardır. Tek bir yerleştirme vektörüne göz atın:

feedback_embeddings["ml_generate_embedding_result"].peek().iloc[0]

Yer paylaşımı oluşturma işlemi "kısmi başarı" sözleşmesi kapsamında çalışır. Bu durumda bazı satırlarda hata olabilir ve bu satırlarda yerleşim oluşturulmayabilir. Hata mesajları 'ml_generate_embedding_status' sütununda gösterilir. Boş, hata olmadığı anlamına gelir.

Yerleşimlerini, yalnızca hata oluşmayan satırları içerecek şekilde filtreleyin.

mask = feedback_embeddings["ml_generate_embedding_status"] == ""
valid_embeddings = feedback_embeddings[mask]
valid_embeddings.shape

6. Metin gömmeleri kullanarak küme oluşturma

Ardından, k-ortalama kullanarak yerleştirmeleri kümeleyin. Bu demo için rastgele sayıda grup (diğer adıyla merkez noktası) kullanın. Prodüksiyon kalitesinde bir çözüm, Silhouette yöntemi gibi bir teknik kullanarak merkez nokta sayısını ayarlamalıdır.

from bigframes.ml.cluster import KMeans

num_clusters = 5
cluster_model = KMeans(n_clusters=num_clusters)
cluster_model.fit(valid_embeddings["ml_generate_embedding_result"])
clusters = cluster_model.predict(valid_embeddings)
clusters.peek()

Tüm yerleşik hataları kaldırın.

mask = clusters["ml_generate_embedding_status"] == ""
clusters = clusters[mask]

Orta nokta başına yorumların dağılımını inceleyin.

clusters.groupby("CENTROID_ID").size()

7. Kümeleri özetleme

Her bir merkez noktasıyla ilişkili bazı yorumlar girin ve Gemini'den şikayetleri özetlemesini isteyin. İstem mühendisliği yeni gelişen bir alandır ancak internette https://www.promptingguide.ai/ gibi iyi örnekler vardır.

from bigframes.ml.llm import GeminiTextGenerator

preamble = "What is the main concern in this list of user complaints:"
suffix = "Write the main issue using a formal tone."

# Now let's sample the raw comments and get the LLM to summarize them.
prompts = []
for centroid_id in range(1, num_clusters + 1):
  cluster = clusters[clusters["CENTROID_ID"] == centroid_id]
  comments = "\n".join(["- {0}".format(x) for x in cluster.content.peek(40)])
  prompts.append("{}:\n{}\n{}".format(preamble, comments, suffix))

prompt_df = bpd.DataFrame(prompts)
gemini = GeminiTextGenerator(model_name="gemini-1.5-flash-001")
issues = gemini.predict(X=prompt_df, temperature=0.0)
issues.peek()

Özetlerden rapor yazmak için Gemini'yi kullanın.

from IPython.display import display, Markdown

prompt = "Turn this list of issues into a short, concise report:"
for value in issues["ml_generate_text_llm_result"]:
  prompt += "- {}".format(value)
prompt += "Using a formal tone, write a markdown text format report."

summary_df = bpd.DataFrame(([prompt]))
summary = gemini.predict(X=summary_df, temperature=0.0)

report = (summary["ml_generate_text_llm_result"].values[0])
display(Markdown(report))

8. Temizleme

Bu eğitim için yeni bir Google Cloud projesi oluşturduysanız oluşturulan tablolar veya diğer kaynaklar için ek ücret alınmaması amacıyla projeyi silebilirsiniz.

9. Tebrikler!

BigQuery veri çerçevelerini kullanarak yapılandırılmış ve yapılandırılmamış verileri analiz ettiniz. Bu süreçte Google Cloud'un herkese açık veri kümelerini, BigQuery Studio'daki Python not defterlerini, BigQuery ML'yi, Vertex AI'ı ve BigQuery Studio'nun doğal dilden Python'a çeviri özelliklerini keşfettiniz. Tebrikler!

Sonraki adımlar